Heads Plugin API 2 [1.13 - 1.17] 2.0.11

Make it easy to use or spawn custom created textured heads from your plugins.

  1. cc007
    Tested Minecraft Versions:
    • 1.7
    • 1.8
    • 1.9
    • 1.10
    • 1.11
    • 1.12
    • 1.13
    • 1.14
    • 1.15
    • 1.16
    • 1.17
    Contributors:
    Flexo013, Killje
    Heads Plugin API

    Tested compatibility: 1.13 - 1.17.1 (Both Spigot and Paper)

    HeadsPluginAPI v1.9.0 and older supports 1.8-beta - 1.13 and partially supports version 1.7.10


    Attention!
    If you are using java 16 and newer (which is required for Minecraft 1.17+), you will need to add the following to your startup script of the server:
    Code (Text):
    --illegal-access=permit --add-opens java.base/java.lang.invoke=ALL-UNNAMED
    In Java 15 and earlier, these settings were the default, but Java 16 made the way you interact with certain parts of the code more strict. These parameters are needed for my plugin to work correctly, due to my use of the Spring Framework. As an example, the startup.bat script could look something like this (with Spigot):

    Code (Text):
    @echo off
    java --illegal-access=warn --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED -Xmx4g -jar spigot.jar
    pause

    HeadsPlugin is an API which makes it possible to easily create plugins that use custom skinned heads/skulls. Examples of plugins that use this API are HeadsInventory and HeadSweeper.


    Heads Inventory is a plugin to spawn in decorational heads, to improve your builds and add an extra level of detail. The plugin does not only provide access to player heads, but also provides custom skinned heads from a heads database website like heads.freshcoal.com, minecraft-heads.com and mineskin.org.

    Supported databases
    minecraft-heads 600x200.png mineskin 600x200.png freshcoal 600x200.png

    Features
    • Categorized high quality heads
    • Manual head search in entire database (60000+ heads)
    • Creating custom categories
    • Categorized heads caching in event of database downtime
    • Select a different database source
    • Fully documented with a wiki (https://github.com/CC007/HeadsPluginAPI/wiki) and javadoc (link available on the wiki)
    Commands

    The plugin provides the following /headspluginapi commands (/hpa for short):
    • /headspluginapi (listcategories | listcat | lstcat | list | lst | showcategories | showcat | shwcat | show | shw)
      Show a list of all categories
    • /headspluginapi (update | up | updateheads | uh | uphds) [CATEGORY_NAME]
      Update all or a specific category (requires the headspluginapi.update permission)
    Permissions

    headspluginapi.update: allow a player to use the /headspluginapi update command

    Wiki

    To use the API in your plugin, you can find how to do this on the HeadsPluginAPI wiki

    Contact info
    Email: [email protected]

    Discord: https://discord.gg/8RQfMX2

    Images

    1.png 2.png 3.png 4.png 5.png 6.png

Recent Reviews

  1. namad0lan
    namad0lan
    5/5,
    Version: 2.0.10
    I uninstalled custom heads from my server time ago and now trying to reinstall them my server wont allow any command (so basically no one can play since first we need to login with password)

    I left 5 starts regardless because it used to be a good plugin
    1. cc007
      Author's Response
      I don't know this custom heads plugin.

      My plugin doesn't need any login with password. All you need is another plugin that uses this API, like HeadsInventory and give players the required perms or op.
  2. evilfaster
    evilfaster
    4/5,
    Version: 2.0.10
    the plugins are excellent but it also works for 1.16.4? because I put it on the server and it won't let the users enter and neither will I, because I'm the op?
    1. cc007
      Author's Response
      I will take a look at that right now. I didn't have time to throroughly test 1.16.4 yet
  3. Xorgon
    Xorgon
    5/5,
    Version: 2.0.8
    A very useful and well supported API with an extremely active developer! I would definitely recommend using this in combination with HeadsInventory.
  4. Xorgon
    Xorgon
    5/5,
    Version: 2.0.7
    A great plugin, very intuitive and well designed. It's also well supported by an extremely responsive developer.
  5. Xorgon
    Xorgon
    5/5,
    Version: 2.0.6
    A very useful and well supported API with an extremely active developer! I would definitely recommend using this in combination with HeadsInventory.
  6. Keopsfenks
    Keopsfenks
    5/5,
    Version: 2.0.6
    [17:11:27] [Server thread/INFO]: [HeadsPluginAPI] Enabling HeadsPluginAPI v2.0.6
    [17:11:27] [Thread-328/INFO]: [NBTAPI] [NBTAPI] The NBT-API seems to be up-to-date!
    [17:11:27] [Server thread/WARN]: [HeadsPluginAPI] Loaded class ch.qos.logback.core.Appender from Vixio v2.0.4 which is not a depend, softdepend or loadbefore of this plugin.
    [17:11:27] [Server thread/ERROR]: Error occurred while enabling HeadsPluginAPI v2.0.6 (Is it up to date?)
    java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.apache.logging.slf4j.Log4jLoggerFactory loaded from file:/citrine/survival/cache/patched_1.15.2.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.apache.logging.slf4j.Log4jLoggerFactory
    at org.springframework.util.Assert.instanceCheckFailed(Assert.java:696) ~[?:?]
    at org.springframework.util.Assert.isInstanceOf(Assert.java:596) ~[?:?]
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:281) ~[?:?]
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:104) ~[?:?]
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:239) ~[?:?]
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:220) ~[?:?]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[?:?]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[?:?]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[?:?]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) ~[?:?]
    at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:70) ~[?:?]
    at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:47) ~[?:?]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:305) ~[?:?]
    at com.github.cc007.headsplugin.HeadsPlugin.onEnable(HeadsPlugin.java:88) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:380) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:483) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugin(CraftServer.java:472) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugins(CraftServer.java:386) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.reload(CraftServer.java:893) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.Bukkit.reload(Bukkit.java:666) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:54) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.15.2.jar:git-Paper-370]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:761) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1866) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1674) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:47) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:5) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:23) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.MinecraftServer.ba(MinecraftServer.java:1105) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:1098) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.MinecraftServer.sleepForTick(MinecraftServer.java:1059) ~[patched_1.15.2.jar:git-Paper-370]
    at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:974) ~[patched_1.15.2.jar:git-Paper-370]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]
    [17:11:27] [Server thread/INFO]: [HeadsPluginAPI] Disabling HeadsPluginAPI v2.0.6

    Paper 1.15.2
  7. Pizzaguy123
    Pizzaguy123
    5/5,
    Version: 2.0.4
    Thanks you soooooooo much for finally updating this for 1.16 I am super happy!!!!! love this plugin :D <3
  8. bibe123
    bibe123
    5/5,
    Version: 1.7.1
    [17:44:49] [Thread-10/INFO]: [HeadsPluginAPI] Done updating games.json
    [17:44:49] [Thread-10/INFO]: [HeadsPluginAPI] Updating mobs.json
    [17:44:50] [Thread-10/INFO]: [HeadsPluginAPI] Done updating mobs.json
    [17:44:50] [Thread-10/INFO]: [HeadsPluginAPI] Updating characters.json
    [17:44:51] [Thread-10/INFO]: [HeadsPluginAPI] Done updating characters.json
    [17:44:52] [Thread-10/INFO]: [HeadsPluginAPI] Updating pokemon.json
    [17:44:53] [Thread-10/INFO]: [HeadsPluginAPI] Done updating pokemon.json
    [17:44:53] [Thread-10/INFO]: [HeadsPluginAPI] Updating sweeper.json
    [17:44:53] [Thread-10/WARN]: Could not get category sweeper: unable to connect to the website, using cache instead.
    [17:44:53] [Thread-10/ERROR]: No cache was found for category sweeper!
    [17:44:53] [Thread-10/INFO]: [HeadsPluginAPI] Updating rwby.json
    [17:44:54] [Thread-10/INFO]: [HeadsPluginAPI] Done updating rwby.json
    [17:44:54] [Thread-10/INFO]: [HeadsPluginAPI] Updating doge.json
    [17:44:54] [Thread-10/ERROR]: [HeadsPluginAPI] An unknown exception has occurred. Please check if the heads website is online.
    [17:44:54] [Thread-10/ERROR]: [HeadsPluginAPI] null
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed
    at sun.security.ssl.Alerts.getSSLException(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.Handshaker.processLoop(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.Handshaker.process_record(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) ~[?:1.8.0_191]
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) ~[?:1.8.0_191]
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) ~[?:1.8.0_191]
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source) ~[?:1.8.0_191]
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) ~[?:1.8.0_191]
    at java.net.HttpURLConnection.getResponseCode(Unknown Source) ~[?:1.8.0_191]
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source) ~[?:1.8.0_191]
    at com.github.cc007.headsplugin.utils.URLReader.readUrl(URLReader.java:64) ~[HeadsPluginAPI-1.7.1-1.13.jar:?]
    at com.github.cc007.headsplugin.utils.loader.MinecraftHeadsLoader.getHeads(MinecraftHeadsLoader.java:61) ~[HeadsPluginAPI-1.7.1-1.13.jar:?]
    at com.github.cc007.headsplugin.utils.loader.HeadsLoader.loadCustomCategory(HeadsLoader.java:166) ~[HeadsPluginAPI-1.7.1-1.13.jar:?]
    at com.github.cc007.headsplugin.utils.loader.HeadsLoader.loadCustomCategory(HeadsLoader.java:117) ~[HeadsPluginAPI-1.7.1-1.13.jar:?]
    at com.github.cc007.headsplugin.utils.loader.HeadsLoader.loadCustomCategories(HeadsLoader.java:69) ~[HeadsPluginAPI-1.7.1-1.13.jar:?]
    at com.github.cc007.headsplugin.utils.loader.HeadsLoader.loadCategories(HeadsLoader.java:49) ~[HeadsPluginAPI-1.7.1-1.13.jar:?]
    at com.github.cc007.headsplugin.utils.HeadsUtils.loadCategories(HeadsUtils.java:153) ~[HeadsPluginAPI-1.7.1-1.13.jar:?]
    at com.github.cc007.headsplugin.HeadsPlugin$1.run(HeadsPlugin.java:120) [HeadsPluginAPI-1.7.1-1.13.jar:?]
    Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed
    at sun.security.validator.PKIXValidator.doValidate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.Validator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) ~[?:1.8.0_191]
    ... 22 more
    Caused by: java.security.cert.CertPathValidatorException: validity check failed
    at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(Unknown Source) ~[?:1.8.0_191]
    at java.security.cert.CertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.PKIXValidator.doValidate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.Validator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) ~[?:1.8.0_191]
    ... 22 more
    Caused by: java.security.cert.CertificateExpiredException: NotAfter: Mon Dec 31 16:45:49 ICT 2018
    at sun.security.x509.CertificateValidity.valid(Unknown Source) ~[?:1.8.0_191]
    at sun.security.x509.X509CertImpl.checkValidity(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.BasicChecker.verifyValidity(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.BasicChecker.check(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(Unknown Source) ~[?:1.8.0_191]
    at java.security.cert.CertPathValidator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.PKIXValidator.doValidate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.validator.Validator.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source) ~[?:1.8.0_191]
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) ~[?:1.8.0_191]
    ... 22 more
    1. cc007
      Author's Response
      Looks like one of the databases let their Security Certificate expire. Does this still happen or is it fixed now?
  9. comonier
    comonier
    5/5,
    Version: 1.7.1
    Simply beautiful and wonderful, all the best, thank you for your dedication.The players on my server were charging me something of the genre and you simply created what they wanted.
  10. arboriginal
    arboriginal
    5/5,
    Version: 1.7.1
    Used not directly but with HeadsInventory, seems to works well.
    Didn't notice errors for now, so thanks!