From bb7975d0f140c4fff249a447194dc4edae9856ce Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 12 Oct 2025 22:57:51 +0200 Subject: [PATCH 1/6] Feature: allow custom entity / painting types --- .../game/entity/type/BuiltinEntityType.java | 177 +++++++++++++++++ .../game/entity/type/BuiltinPaintingType.java | 61 ++++++ .../data/game/entity/type/EntityType.java | 180 ++---------------- .../data/game/entity/type/PaintingType.java | 64 +------ .../data/game/item/component/ItemTypes.java | 4 +- .../ClientboundAwardStatsPacket.java | 4 +- .../entity/ClientboundAddEntityPacket.java | 13 +- 7 files changed, 272 insertions(+), 231 deletions(-) create mode 100644 protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java create mode 100644 protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinPaintingType.java diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java new file mode 100644 index 000000000..456e11f0a --- /dev/null +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java @@ -0,0 +1,177 @@ +package org.geysermc.mcprotocollib.protocol.data.game.entity.type; + +import lombok.Getter; + +public enum BuiltinEntityType implements EntityType { + ACACIA_BOAT, + ACACIA_CHEST_BOAT, + ALLAY, + AREA_EFFECT_CLOUD, + ARMADILLO, + ARMOR_STAND, + ARROW(true), + AXOLOTL, + BAMBOO_CHEST_RAFT, + BAMBOO_RAFT, + BAT, + BEE, + BIRCH_BOAT, + BIRCH_CHEST_BOAT, + BLAZE, + BLOCK_DISPLAY, + BOGGED, + BREEZE, + BREEZE_WIND_CHARGE(true), + CAMEL, + CAT, + CAVE_SPIDER, + CHERRY_BOAT, + CHERRY_CHEST_BOAT, + CHEST_MINECART, + CHICKEN, + COD, + COPPER_GOLEM, + COMMAND_BLOCK_MINECART, + COW, + CREAKING, + CREEPER, + DARK_OAK_BOAT, + DARK_OAK_CHEST_BOAT, + DOLPHIN, + DONKEY, + DRAGON_FIREBALL(true), + DROWNED, + EGG(true), + ELDER_GUARDIAN, + ENDERMAN, + ENDERMITE, + ENDER_DRAGON, + ENDER_PEARL(true), + END_CRYSTAL, + EVOKER, + EVOKER_FANGS, + EXPERIENCE_BOTTLE(true), + EXPERIENCE_ORB, + EYE_OF_ENDER, + FALLING_BLOCK, + FIREBALL(true), + FIREWORK_ROCKET(true), + FOX, + FROG, + FURNACE_MINECART, + GHAST, + HAPPY_GHAST, + GIANT, + GLOW_ITEM_FRAME, + GLOW_SQUID, + GOAT, + GUARDIAN, + HOGLIN, + HOPPER_MINECART, + HORSE, + HUSK, + ILLUSIONER, + INTERACTION, + IRON_GOLEM, + ITEM, + ITEM_DISPLAY, + ITEM_FRAME, + JUNGLE_BOAT, + JUNGLE_CHEST_BOAT, + LEASH_KNOT, + LIGHTNING_BOLT, + LLAMA, + LLAMA_SPIT(true), + MAGMA_CUBE, + MANGROVE_BOAT, + MANGROVE_CHEST_BOAT, + MANNEQUIN, + MARKER, + MINECART, + MOOSHROOM, + MULE, + OAK_BOAT, + OAK_CHEST_BOAT, + OCELOT, + OMINOUS_ITEM_SPAWNER, + PAINTING, + PALE_OAK_BOAT, + PALE_OAK_CHEST_BOAT, + PANDA, + PARROT, + PHANTOM, + PIG, + PIGLIN, + PIGLIN_BRUTE, + PILLAGER, + POLAR_BEAR, + SPLASH_POTION(true), + LINGERING_POTION(true), + PUFFERFISH, + RABBIT, + RAVAGER, + SALMON, + SHEEP, + SHULKER, + SHULKER_BULLET(true), + SILVERFISH, + SKELETON, + SKELETON_HORSE, + SLIME, + SMALL_FIREBALL(true), + SNIFFER, + SNOWBALL(true), + SNOW_GOLEM, + SPAWNER_MINECART, + SPECTRAL_ARROW(true), + SPIDER, + SPRUCE_BOAT, + SPRUCE_CHEST_BOAT, + SQUID, + STRAY, + STRIDER, + TADPOLE, + TEXT_DISPLAY, + TNT, + TNT_MINECART, + TRADER_LLAMA, + TRIDENT(true), + TROPICAL_FISH, + TURTLE, + VEX, + VILLAGER, + VINDICATOR, + WANDERING_TRADER, + WARDEN, + WIND_CHARGE(true), + WITCH, + WITHER, + WITHER_SKELETON, + WITHER_SKULL(true), + WOLF, + ZOGLIN, + ZOMBIE, + ZOMBIE_HORSE, + ZOMBIE_VILLAGER, + ZOMBIFIED_PIGLIN, + PLAYER, + FISHING_BOBBER(true); + + @Getter + private final boolean projectile; + + BuiltinEntityType() { + this.projectile = false; + } + + BuiltinEntityType(boolean projectile) { + this.projectile = projectile; + } + + public static final BuiltinEntityType[] VALUES = values(); + + @Override + public int id() { + return ordinal(); + } +} diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinPaintingType.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinPaintingType.java new file mode 100644 index 000000000..9dfec884c --- /dev/null +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinPaintingType.java @@ -0,0 +1,61 @@ +package org.geysermc.mcprotocollib.protocol.data.game.entity.type; + +public enum BuiltinPaintingType implements PaintingType { + KEBAB, + AZTEC, + ALBAN, + AZTEC2, + BOMB, + PLANT, + WASTELAND, + POOL, + COURBET, + SEA, + SUNSET, + CREEBET, + WANDERER, + GRAHAM, + MATCH, + BUST, + STAGE, + VOID, + SKULL_AND_ROSES, + WITHER, + FIGHTERS, + POINTER, + PIGSCENE, + BURNING_SKULL, + SKELETON, + EARTH, + WIND, + WATER, + FIRE, + DONKEY_KONG, + BAROQUE, + HUMBLE, + MEDITATIVE, + PRAIRIE_RIDE, + UNPACKED, + BACKYARD, + BOUQUET, + CAVEBIRD, + CHANGING, + COTAN, + ENDBOSS, + FERN, + FINDING, + LOWMIST, + ORB, + OWLEMONS, + PASSAGE, + POND, + SUNFLOWERS, + TIDES; + + public static final BuiltinPaintingType[] VALUES = values(); + + @Override + public int id() { + return ordinal(); + } +} diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java index 89862200b..a6f559af3 100644 --- a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java @@ -1,176 +1,22 @@ package org.geysermc.mcprotocollib.protocol.data.game.entity.type; -import lombok.Getter; +public interface EntityType { -public enum EntityType { - ACACIA_BOAT, - ACACIA_CHEST_BOAT, - ALLAY, - AREA_EFFECT_CLOUD, - ARMADILLO, - ARMOR_STAND, - ARROW(true), - AXOLOTL, - BAMBOO_CHEST_RAFT, - BAMBOO_RAFT, - BAT, - BEE, - BIRCH_BOAT, - BIRCH_CHEST_BOAT, - BLAZE, - BLOCK_DISPLAY, - BOGGED, - BREEZE, - BREEZE_WIND_CHARGE(true), - CAMEL, - CAT, - CAVE_SPIDER, - CHERRY_BOAT, - CHERRY_CHEST_BOAT, - CHEST_MINECART, - CHICKEN, - COD, - COPPER_GOLEM, - COMMAND_BLOCK_MINECART, - COW, - CREAKING, - CREEPER, - DARK_OAK_BOAT, - DARK_OAK_CHEST_BOAT, - DOLPHIN, - DONKEY, - DRAGON_FIREBALL(true), - DROWNED, - EGG(true), - ELDER_GUARDIAN, - ENDERMAN, - ENDERMITE, - ENDER_DRAGON, - ENDER_PEARL(true), - END_CRYSTAL, - EVOKER, - EVOKER_FANGS, - EXPERIENCE_BOTTLE(true), - EXPERIENCE_ORB, - EYE_OF_ENDER, - FALLING_BLOCK, - FIREBALL(true), - FIREWORK_ROCKET(true), - FOX, - FROG, - FURNACE_MINECART, - GHAST, - HAPPY_GHAST, - GIANT, - GLOW_ITEM_FRAME, - GLOW_SQUID, - GOAT, - GUARDIAN, - HOGLIN, - HOPPER_MINECART, - HORSE, - HUSK, - ILLUSIONER, - INTERACTION, - IRON_GOLEM, - ITEM, - ITEM_DISPLAY, - ITEM_FRAME, - JUNGLE_BOAT, - JUNGLE_CHEST_BOAT, - LEASH_KNOT, - LIGHTNING_BOLT, - LLAMA, - LLAMA_SPIT(true), - MAGMA_CUBE, - MANGROVE_BOAT, - MANGROVE_CHEST_BOAT, - MANNEQUIN, - MARKER, - MINECART, - MOOSHROOM, - MULE, - OAK_BOAT, - OAK_CHEST_BOAT, - OCELOT, - OMINOUS_ITEM_SPAWNER, - PAINTING, - PALE_OAK_BOAT, - PALE_OAK_CHEST_BOAT, - PANDA, - PARROT, - PHANTOM, - PIG, - PIGLIN, - PIGLIN_BRUTE, - PILLAGER, - POLAR_BEAR, - SPLASH_POTION(true), - LINGERING_POTION(true), - PUFFERFISH, - RABBIT, - RAVAGER, - SALMON, - SHEEP, - SHULKER, - SHULKER_BULLET(true), - SILVERFISH, - SKELETON, - SKELETON_HORSE, - SLIME, - SMALL_FIREBALL(true), - SNIFFER, - SNOWBALL(true), - SNOW_GOLEM, - SPAWNER_MINECART, - SPECTRAL_ARROW(true), - SPIDER, - SPRUCE_BOAT, - SPRUCE_CHEST_BOAT, - SQUID, - STRAY, - STRIDER, - TADPOLE, - TEXT_DISPLAY, - TNT, - TNT_MINECART, - TRADER_LLAMA, - TRIDENT(true), - TROPICAL_FISH, - TURTLE, - VEX, - VILLAGER, - VINDICATOR, - WANDERING_TRADER, - WARDEN, - WIND_CHARGE(true), - WITCH, - WITHER, - WITHER_SKELETON, - WITHER_SKULL(true), - WOLF, - ZOGLIN, - ZOMBIE, - ZOMBIE_HORSE, - ZOMBIE_VILLAGER, - ZOMBIFIED_PIGLIN, - PLAYER, - FISHING_BOBBER(true); + int id(); - @Getter - private final boolean projectile; + boolean isProjectile(); - EntityType() { - this.projectile = false; + static EntityType from(int id) { + if (id < 0 || id >= BuiltinEntityType.VALUES.length) { + return new Custom(id); + } + return BuiltinEntityType.VALUES[id]; } - EntityType(boolean projectile) { - this.projectile = projectile; - } - - private static final EntityType[] VALUES = values(); - - public static EntityType from(int id) { - return VALUES[id]; + record Custom(int id) implements EntityType { + @Override + public boolean isProjectile() { + return false; + } } } diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/PaintingType.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/PaintingType.java index fa86e9355..b8e750503 100644 --- a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/PaintingType.java +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/PaintingType.java @@ -1,60 +1,16 @@ package org.geysermc.mcprotocollib.protocol.data.game.entity.type; -public enum PaintingType { - KEBAB, - AZTEC, - ALBAN, - AZTEC2, - BOMB, - PLANT, - WASTELAND, - POOL, - COURBET, - SEA, - SUNSET, - CREEBET, - WANDERER, - GRAHAM, - MATCH, - BUST, - STAGE, - VOID, - SKULL_AND_ROSES, - WITHER, - FIGHTERS, - POINTER, - PIGSCENE, - BURNING_SKULL, - SKELETON, - EARTH, - WIND, - WATER, - FIRE, - DONKEY_KONG, - BAROQUE, - HUMBLE, - MEDITATIVE, - PRAIRIE_RIDE, - UNPACKED, - BACKYARD, - BOUQUET, - CAVEBIRD, - CHANGING, - COTAN, - ENDBOSS, - FERN, - FINDING, - LOWMIST, - ORB, - OWLEMONS, - PASSAGE, - POND, - SUNFLOWERS, - TIDES; +public interface PaintingType { - private static final PaintingType[] VALUES = values(); + int id(); - public static PaintingType from(int id) { - return VALUES[id]; + static PaintingType from(int id) { + if (id < 0 || id >= BuiltinPaintingType.values().length) { + return new Custom(id); + } + return BuiltinPaintingType.VALUES[id]; + } + + record Custom(int id) implements PaintingType { } } diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/item/component/ItemTypes.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/item/component/ItemTypes.java index ce6ed233b..6a5c1561e 100644 --- a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/item/component/ItemTypes.java +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/item/component/ItemTypes.java @@ -507,7 +507,7 @@ public static void writeTrimPattern(ByteBuf buf, ArmorTrim.TrimPattern pattern) buf.writeBoolean(pattern.decal()); } - public static > TypedEntityData readTypedEntityData(ByteBuf buf, Function reader) { + public static TypedEntityData readTypedEntityData(ByteBuf buf, Function reader) { return new TypedEntityData<>(reader.apply(buf), MinecraftTypes.readCompoundTag(buf)); } @@ -521,7 +521,7 @@ public static EntityType readEntityType(ByteBuf buf) { } public static void writeEntityType(ByteBuf buf, EntityType state) { - MinecraftTypes.writeVarInt(buf, state.ordinal()); + MinecraftTypes.writeVarInt(buf, state.id()); } public static BlockEntityType readBlockEntityType(ByteBuf buf) { diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/ClientboundAwardStatsPacket.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/ClientboundAwardStatsPacket.java index cb25cd1c5..1b3f25aa2 100644 --- a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/ClientboundAwardStatsPacket.java +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/ClientboundAwardStatsPacket.java @@ -76,10 +76,10 @@ public void serialize(ByteBuf out) { statisticId = ((DropItemStatistic) statistic).getId(); } else if (statistic instanceof KillEntityStatistic) { category = StatisticCategory.KILL_ENTITY; - statisticId = ((KillEntityStatistic) statistic).getEntity().ordinal(); + statisticId = ((KillEntityStatistic) statistic).getEntity().id(); } else if (statistic instanceof KilledByEntityStatistic) { category = StatisticCategory.KILLED_BY_ENTITY; - statisticId = ((KilledByEntityStatistic) statistic).getEntity().ordinal(); + statisticId = ((KilledByEntityStatistic) statistic).getEntity().id(); } else if (statistic instanceof CustomStatistic) { category = StatisticCategory.CUSTOM; statisticId = ((CustomStatistic) statistic).ordinal(); diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/entity/ClientboundAddEntityPacket.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/entity/ClientboundAddEntityPacket.java index bc17d3e1d..48fb8249f 100644 --- a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/entity/ClientboundAddEntityPacket.java +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/packet/ingame/clientbound/entity/ClientboundAddEntityPacket.java @@ -15,6 +15,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.object.ObjectData; import org.geysermc.mcprotocollib.protocol.data.game.entity.object.ProjectileData; import org.geysermc.mcprotocollib.protocol.data.game.entity.object.WardenData; +import org.geysermc.mcprotocollib.protocol.data.game.entity.type.BuiltinEntityType; import org.geysermc.mcprotocollib.protocol.data.game.entity.type.EntityType; import java.util.UUID; @@ -66,15 +67,15 @@ public ClientboundAddEntityPacket(ByteBuf in) { this.headYaw = in.readByte() * 360 / 256f; int data = MinecraftTypes.readVarInt(in); - if (this.type == EntityType.MINECART) { + if (this.type == BuiltinEntityType.MINECART) { this.data = MinecartType.from(data); - } else if (this.type == EntityType.ITEM_FRAME || this.type == EntityType.GLOW_ITEM_FRAME || this.type == EntityType.PAINTING) { + } else if (this.type == BuiltinEntityType.ITEM_FRAME || this.type == BuiltinEntityType.GLOW_ITEM_FRAME || this.type == BuiltinEntityType.PAINTING) { this.data = Direction.VALUES[data]; - } else if (this.type == EntityType.FALLING_BLOCK) { + } else if (this.type == BuiltinEntityType.FALLING_BLOCK) { this.data = new FallingBlockData(data & 65535, data >> 16); - } else if (this.type.isProjectile()) { + } else if (type.isProjectile()) { this.data = new ProjectileData(data); - } else if (this.type == EntityType.WARDEN) { + } else if (this.type == BuiltinEntityType.WARDEN) { this.data = new WardenData(data); } else { if (data == 0) { @@ -89,7 +90,7 @@ public ClientboundAddEntityPacket(ByteBuf in) { public void serialize(ByteBuf out) { MinecraftTypes.writeVarInt(out, this.entityId); MinecraftTypes.writeUUID(out, this.uuid); - MinecraftTypes.writeVarInt(out, this.type.ordinal()); + MinecraftTypes.writeVarInt(out, this.type.id()); out.writeDouble(this.x); out.writeDouble(this.y); out.writeDouble(this.z); From ebbe25d941a1881cf55fee1221ac6118a336fe8f Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Mon, 13 Oct 2025 16:46:17 +0200 Subject: [PATCH 2/6] Use updated github actions, add built-in method to check entity types --- .github/workflows/build.yml | 49 +++++++------------ .github/workflows/deploy.yml | 37 -------------- .../data/game/entity/type/EntityType.java | 4 ++ 3 files changed, 23 insertions(+), 67 deletions(-) delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f2179be8f..4933a5fb1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,37 +1,26 @@ -name: Java CI with Gradle +name: Build on: + workflow_dispatch: push: - branches-ignore: - - 'master' - - 'feature/**' - pull_request: jobs: - build: - # Only run on PRs if the source branch is on someone else's repo - if: "${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}" + build: + runs-on: ubuntu-latest + steps: + - name: Setup Gradle + uses: GeyserMC/actions/setup-gradle-composite@master + with: + setup-java_java-version: 17 - runs-on: ubuntu-latest + - name: Build MCPL + run: ./gradlew build - steps: - - name: Checkout repository - # See https://github.com/actions/checkout/commits - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac - - - name: Validate Gradle wrapper - # See https://github.com/gradle/wrapper-validation-action/commits - uses: gradle/wrapper-validation-action@342dbebe7272035434f9baccc29a816ec6dd2c7b - - - name: Set up JDK 17 - # See https://github.com/actions/setup-java/commits - uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 - with: - java-version: 17 - distribution: temurin - - - name: Build - # See https://github.com/gradle/gradle-build-action/commits - uses: gradle/gradle-build-action@3bfe3a46584a206fb8361cdedd0647b0c4204232 - with: - arguments: build + - name: Publish to Maven Repository + if: ${{ success() && github.repository == 'GeyserMC/MCProtocolLib' && (github.ref_name == 'master' || startsWith(github.ref_name, 'feature/')) }} + uses: gradle/gradle-build-action@3bfe3a46584a206fb8361cdedd0647b0c4204232 + env: + ORG_GRADLE_PROJECT_geysermcUsername: ${{ vars.DEPLOY_USER }} + ORG_GRADLE_PROJECT_geysermcPassword: ${{ secrets.DEPLOY_PASS }} + with: + arguments: publish diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index d78358ec4..000000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Deploy - -on: - push: - branches: - - master - - 'feature/**' - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - # See https://github.com/actions/checkout/commits - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac - - - name: Validate Gradle wrapper - # See https://github.com/gradle/wrapper-validation-action/commits - uses: gradle/wrapper-validation-action@342dbebe7272035434f9baccc29a816ec6dd2c7b - - - name: Set up JDK 17 - # See https://github.com/actions/setup-java/commits - uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 - with: - java-version: 17 - distribution: temurin - - - name: Publish to Maven Repository - if: ${{ success() && github.repository == 'GeyserMC/MCProtocolLib' }} - uses: gradle/gradle-build-action@3bfe3a46584a206fb8361cdedd0647b0c4204232 - env: - ORG_GRADLE_PROJECT_geysermcUsername: ${{ vars.DEPLOY_USER }} - ORG_GRADLE_PROJECT_geysermcPassword: ${{ secrets.DEPLOY_PASS }} - with: - arguments: publish diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java index a6f559af3..68edf3645 100644 --- a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/EntityType.java @@ -13,6 +13,10 @@ static EntityType from(int id) { return BuiltinEntityType.VALUES[id]; } + default boolean is(EntityType type) { + return id() == type.id(); + } + record Custom(int id) implements EntityType { @Override public boolean isProjectile() { From c2de64a207a7ae06f67d94c47731acef8eafbe2b Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Mon, 17 Nov 2025 13:55:01 +0100 Subject: [PATCH 3/6] Change branch name --- protocol/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/build.gradle.kts b/protocol/build.gradle.kts index 9a5044bf1..f0d5cddfa 100644 --- a/protocol/build.gradle.kts +++ b/protocol/build.gradle.kts @@ -5,7 +5,7 @@ plugins { jacoco } -version = "1.21.9-SNAPSHOT" +version = "1.21.9-feature-custom-entities" description = "MCProtocolLib is a simple library for communicating with Minecraft clients and servers." dependencies { From 123a909e449075e7ba8c3ad15b3abf80929a3e27 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Wed, 24 Dec 2025 17:35:43 +0100 Subject: [PATCH 4/6] Update to 1.21.11 --- .../protocol/data/game/entity/type/BuiltinEntityType.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java index 456e11f0a..fd2dd8781 100644 --- a/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java +++ b/protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/type/BuiltinEntityType.java @@ -23,6 +23,7 @@ public enum BuiltinEntityType implements EntityType { BREEZE, BREEZE_WIND_CHARGE(true), CAMEL, + CAMEL_HUSK, CAT, CAVE_SPIDER, CHERRY_BOAT, @@ -90,6 +91,7 @@ public enum BuiltinEntityType implements EntityType { MINECART, MOOSHROOM, MULE, + NAUTILUS, OAK_BOAT, OAK_CHEST_BOAT, OCELOT, @@ -98,6 +100,7 @@ public enum BuiltinEntityType implements EntityType { PALE_OAK_BOAT, PALE_OAK_CHEST_BOAT, PANDA, + PARCHED, PARROT, PHANTOM, PIG, @@ -152,6 +155,7 @@ public enum BuiltinEntityType implements EntityType { ZOGLIN, ZOMBIE, ZOMBIE_HORSE, + ZOMBIE_NAUTILUS, ZOMBIE_VILLAGER, ZOMBIFIED_PIGLIN, PLAYER, From f628e85cb1309573ee56655eb8d5d5b8355ae200 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Thu, 5 Feb 2026 17:44:12 +0100 Subject: [PATCH 5/6] actually this is a snapshot --- protocol/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/build.gradle.kts b/protocol/build.gradle.kts index bff15140a..d794e0e31 100644 --- a/protocol/build.gradle.kts +++ b/protocol/build.gradle.kts @@ -5,7 +5,7 @@ plugins { jacoco } -version = "1.21.11-feature-custom-entities" +version = "1.21.11-feature-custom-entities-SNAPSHOT" description = "MCProtocolLib is a simple library for communicating with Minecraft clients and servers." dependencies { From b03a1382a75d9b8b8fce5d82c96590b1dca7e572 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sat, 30 May 2026 17:14:53 +0200 Subject: [PATCH 6/6] Update to 26.1 --- protocol/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/build.gradle.kts b/protocol/build.gradle.kts index d794e0e31..3de44b97a 100644 --- a/protocol/build.gradle.kts +++ b/protocol/build.gradle.kts @@ -5,7 +5,7 @@ plugins { jacoco } -version = "1.21.11-feature-custom-entities-SNAPSHOT" +version = "26.1-feature-custom-entities-SNAPSHOT" description = "MCProtocolLib is a simple library for communicating with Minecraft clients and servers." dependencies {