Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

EntityLib

EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole. Currently, EntityLib is only stable for 1.21.9+, but it will support all versions that PacketEvents supports in the future.
For general support and reports of bugs, join the Discord server.

Currently supported platforms are spigot and velocity You can easily use EntityLib platformless by using the api or common module

If you like EntityLib and or want to sponsor me, visit my ko-fi page :D

EntityLib is published to PVPHub. Snapshots are available on pushes to the main branch, and stable releases are published on GitHub releases. Many thanks to the team at PVP Hub and @Bram1903 for hosting EntityLib

Gradle (Groovy DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation 'io.github.tofaa2:<platform>:<version>'
}

Gradle (Kotlin DSL):

repositories {
mavenCentral()
maven("https://maven.pvphub.me/tofaa")
}
dependencies {
implementation("io.github.tofaa2:<platform>:<version>")
}

Maven:

<dependency>
<groupId>io.github.tofaa2</groupId>
<artifactId><platform></artifactId>
<version><version></version>
</dependency>

NOTE:

EntityLib does not provide packet-events as a dependency, you must have it in your classpath already. EntityLib will also stay at the latest packet-events version at all times

Features

  • Full EntityMeta support
  • Creation of WrapperEntities
  • Keeping track of entities.

Usage

For more realistic examples, please take a look at the test-plugin module. It has an example Bukkit plugin that uses EntityLib. Examples below show usage of the spigot module of entity lib, but the usage is the same for all platforms.

Using the EntityMeta api

classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method insteadintentityID = 1;
WrapperPlayServerSpawnEntitypacket = newWrapperPlayServerSpawnEntity(constructorargs);
EntityMetameta = EntityMeta.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity typePigMetapigMeta = (PigMeta) meta;
// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.WrapperPlayServerEntityMetadatametaPacket = meta.createPacket();
User.sendPacket(metaPacket);
}
}

Creating a WrapperEntity

importcom.github.retrooper.packetevents.protocol.world.Location;
classExample {
publicstaticvoidmain(String[] args) {
PacketEventsAPIapi = ;// create PacketEventsAPI instanceSpigotEntityLibPlatformplatform = newSpigotEntityLibPlatform(this);
APIConfigsettings = newAPIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();
EntityLib.init(platform, settings);
WrapperEntityentity = newWrapperEntity(EntityType); // optional uuid and entity id and meta // You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib.getApi().getEntity(UUID or entityId)// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used togetherEntityMetameta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct typePigMetameta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG// adding a viewer to the entity can be done before or after spawn, doesnt matterentity.addViewer(User); // UUID also applicableentity.removeViewer(User); // UUID also applicableentity.spawn(Location); // Spawns the entity at the given locationentity.remove(); // Removes the entity from the worldentity.rotateHead(floatyaw, floatpitch); // Rotates the head of the entityentity.teleport(Location); // Teleports the entity to the given location.// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from EntityLib#getEntityIdProvider()// You can also set it to a custom provider if needed by calling EntityLib#setEntityIdProvider(EntityIdProvider)intrandomEntityId = EntityLib.getPlatform().getEntityIdProvider().provide();
}
}

Publishing to Maven Central

EntityLib uses the new Maven Central publishing system via the Central Portal (replacing the deprecated OSSRH). To publish, set up the following GitHub secrets:

  • OSSRH_USERNAME: Your Central Portal username (usually your email).
  • OSSRH_PASSWORD: Your publishing token from the Central Portal.
  • GPG_PRIVATE_KEY: Your GPG private key (for signing artifacts).
  • GPG_PASSPHRASE: The passphrase for your GPG key.

Setting Up Central Portal Credentials

  1. Go to Central Portal and log in with your GitHub account.
  2. Create a namespace: In the "Namespaces" section, create a new namespace for your group ID (io.github.tofaa2). This is crucial for publishing to work.
  3. Generate a publishing token from the "Account Settings" > "Publishing Tokens".
  4. Use your email as the username and the token as the password.

Snapshots are automatically published on pushes to the master branch. Stable releases are published when a GitHub release is created.

TODO:

Once this list is complete, i will release a stable version of the library.

  • Implement checks for each EntityMeta to make sure the version specific data is correct.
  • Verify all the EntityMeta packets are working correctly.
  • WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
  • Add support for more actions using WrapperEntities.
  • More javadocs.
  • Make ObjectData actually useful.
  • Multi-version support, currently only 1.18+ is stable.
  • Make class names match the protocol specified names.

Credits

  • PacketEvents for providing the API and retrooper being a cool guy in general
  • Minestom certain mappings were taken from Minestom cause i have not slept in 4 days and it was faster

About

A PacketEvents based utility library for generating and working with EntityMeta and other Entity features

Resources

Stars

155 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages