From 959f6241f496bd3b256ce59fac09c1fbe75bd0b7 Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Wed, 5 Jul 2023 17:23:30 +0530 Subject: [PATCH] implemented villager properties --- .../lol/pyr/znpcsplus/util/VillagerLevel.java | 9 ++++++ .../znpcsplus/util/VillagerProfession.java | 29 +++++++++++++++++++ .../lol/pyr/znpcsplus/util/VillagerType.java | 11 +++++++ .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 3 ++ .../commands/property/PropertySetCommand.java | 3 ++ .../entity/EntityPropertyRegistryImpl.java | 8 +++-- .../znpcsplus/metadata/MetadataFactory.java | 3 ++ .../metadata/V1_10MetadataFactory.java | 5 ++++ .../metadata/V1_14MetadataFactory.java | 6 ++++ .../metadata/V1_15MetadataFactory.java | 6 ++++ .../metadata/V1_17MetadataFactory.java | 6 ++++ .../metadata/V1_8MetadataFactory.java | 5 ++++ .../metadata/V1_9MetadataFactory.java | 5 ++++ .../znpcsplus/npc/NpcTypeRegistryImpl.java | 2 +- .../znpcsplus/packets/V1_8PacketFactory.java | 14 +++++++++ 15 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 api/src/main/java/lol/pyr/znpcsplus/util/VillagerLevel.java create mode 100644 api/src/main/java/lol/pyr/znpcsplus/util/VillagerProfession.java create mode 100644 api/src/main/java/lol/pyr/znpcsplus/util/VillagerType.java diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/VillagerLevel.java b/api/src/main/java/lol/pyr/znpcsplus/util/VillagerLevel.java new file mode 100644 index 0000000..c1d481f --- /dev/null +++ b/api/src/main/java/lol/pyr/znpcsplus/util/VillagerLevel.java @@ -0,0 +1,9 @@ +package lol.pyr.znpcsplus.util; + +public enum VillagerLevel { + STONE, + IRON, + GOLD, + EMERALD, + DIAMOND +} diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/VillagerProfession.java b/api/src/main/java/lol/pyr/znpcsplus/util/VillagerProfession.java new file mode 100644 index 0000000..b083f55 --- /dev/null +++ b/api/src/main/java/lol/pyr/znpcsplus/util/VillagerProfession.java @@ -0,0 +1,29 @@ +package lol.pyr.znpcsplus.util; + +public enum VillagerProfession { + NONE(0), + ARMORER(3), + BUTCHER(4), + CARTOGRAPHER(1), + CLERIC(2), + FARMER(0), + FISHERMAN(0), + FLETCHER(0), + LEATHER_WORKER(4), + LIBRARIAN(1), + MASON(-1), + NITWIT(5), + SHEPHERD(0), + TOOL_SMITH(3), + WEAPON_SMITH(3); + + private final int legacyId; + + VillagerProfession(int legacyId) { + this.legacyId = legacyId; + } + + public int getLegacyId() { + return legacyId; + } +} diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/VillagerType.java b/api/src/main/java/lol/pyr/znpcsplus/util/VillagerType.java new file mode 100644 index 0000000..d29c12b --- /dev/null +++ b/api/src/main/java/lol/pyr/znpcsplus/util/VillagerType.java @@ -0,0 +1,11 @@ +package lol.pyr.znpcsplus.util; + +public enum VillagerType { + DESERT, + JUNGLE, + PLAINS, + SAVANNA, + SNOW, + SWAMP, + TAIGA +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 16d56cf..2a93cee 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -288,6 +288,9 @@ public class ZNpcsPlus extends JavaPlugin { registerEnumParser(manager, SpellType.class, incorrectUsageMessage); registerEnumParser(manager, FoxVariant.class, incorrectUsageMessage); registerEnumParser(manager, FrogVariant.class, incorrectUsageMessage); + registerEnumParser(manager, VillagerType.class, incorrectUsageMessage); + registerEnumParser(manager, VillagerProfession.class, incorrectUsageMessage); + registerEnumParser(manager, VillagerLevel.class, incorrectUsageMessage); manager.registerCommand("npc", new MultiCommand(loadHelpMessage("root")) .addSubcommand("create", new CreateCommand(npcRegistry, typeRegistry)) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java index ae7768e..a24714e 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java @@ -128,6 +128,9 @@ public class PropertySetCommand implements CommandHandler { if (type == SpellType.class) return context.suggestEnum(SpellType.values()); if (type == FoxVariant.class) return context.suggestEnum(FoxVariant.values()); if (type == FrogVariant.class) return context.suggestEnum(FrogVariant.values()); + if (type == VillagerType.class) return context.suggestEnum(VillagerType.values()); + if (type == VillagerProfession.class) return context.suggestEnum(VillagerProfession.values()); + if (type == VillagerLevel.class) return context.suggestEnum(VillagerLevel.values()); } else if (context.argSize() == 4) { if (type == BlockState.class) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java index a69ae76..9703876 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -41,6 +41,9 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerEnumSerializer(SpellType.class); registerEnumSerializer(FoxVariant.class); registerEnumSerializer(FrogVariant.class); + registerEnumSerializer(VillagerType.class); + registerEnumSerializer(VillagerProfession.class); + registerEnumSerializer(VillagerLevel.class); registerType("glow", NamedTextColor.class); registerType("fire", false); @@ -186,8 +189,9 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("parrot_variant", 0); // TODO // Villager - registerType("villager_ethnicity", 1); // TODO: how tf does this work? probably need to look in mc src - registerType("villager_job", null); // TODO + registerType("villager_type", VillagerType.PLAINS); + registerType("villager_profession", VillagerProfession.NONE); + registerType("villager_level", VillagerLevel.STONE); // Show Golem registerType("pumpkin", true); // TODO diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java index 1ad92e9..855f9e4 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java @@ -86,4 +86,7 @@ public interface MetadataFactory { // Ghast EntityData ghastAttacking(boolean attacking); + + // Villager + EntityData villagerData(int type, int profession, int level); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java index d45dc11..903df8f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java @@ -85,4 +85,9 @@ public class V1_10MetadataFactory extends V1_9MetadataFactory { public EntityData ghastAttacking(boolean attacking) { return newEntityData(12, EntityDataTypes.BOOLEAN, attacking); } + + @Override + public EntityData villagerData(int type, int profession, int level) { + return newEntityData(13, EntityDataTypes.INT, profession); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java index e6a8297..bd34101 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java @@ -3,6 +3,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; +import com.github.retrooper.packetevents.protocol.entity.villager.VillagerData; import lol.pyr.znpcsplus.util.CatVariant; import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.ParrotVariant; @@ -134,4 +135,9 @@ public class V1_14MetadataFactory extends V1_13MetadataFactory { public EntityData ghastAttacking(boolean attacking) { return newEntityData(14, EntityDataTypes.BOOLEAN, attacking); } + + @Override + public EntityData villagerData(int type, int profession, int level) { + return newEntityData(16, EntityDataTypes.VILLAGER_DATA, new VillagerData(type, profession, level)); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java index b56fb01..0b53db8 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java @@ -2,6 +2,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.entity.villager.VillagerData; import lol.pyr.znpcsplus.util.CatVariant; import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.ParrotVariant; @@ -118,4 +119,9 @@ public class V1_15MetadataFactory extends V1_14MetadataFactory { public EntityData ghastAttacking(boolean attacking) { return newEntityData(15, EntityDataTypes.BOOLEAN, attacking); } + + @Override + public EntityData villagerData(int type, int profession, int level) { + return newEntityData(17, EntityDataTypes.VILLAGER_DATA, new VillagerData(type, profession, level)); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java index 4c139e0..aeb2a86 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java @@ -2,6 +2,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.entity.villager.VillagerData; import lol.pyr.znpcsplus.util.CatVariant; import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.ParrotVariant; @@ -178,4 +179,9 @@ public class V1_17MetadataFactory extends V1_16MetadataFactory { public EntityData ghastAttacking(boolean attacking) { return newEntityData(16, EntityDataTypes.BOOLEAN, attacking); } + + @Override + public EntityData villagerData(int type, int profession, int level) { + return newEntityData(18, EntityDataTypes.VILLAGER_DATA, new VillagerData(type, profession, level)); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java index 45e171c..11efae6 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java @@ -205,6 +205,11 @@ public class V1_8MetadataFactory implements MetadataFactory { return newEntityData(16, EntityDataTypes.BYTE, (byte) (attacking ? 1 : 0)); } + @Override + public EntityData villagerData(int type, int profession, int level) { + return newEntityData(16, EntityDataTypes.INT, profession); + } + @Override public EntityData silent(boolean enabled) { return newEntityData(4, EntityDataTypes.BYTE, (byte) (enabled ? 1 : 0)); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java index a7f7130..d368509 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java @@ -67,4 +67,9 @@ public class V1_9MetadataFactory extends V1_8MetadataFactory { public EntityData ghastAttacking(boolean attacking) { return newEntityData(11, EntityDataTypes.BOOLEAN, attacking); } + + @Override + public EntityData villagerData(int type, int profession, int level) { + return newEntityData(12, EntityDataTypes.INT, profession); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java index 739ecdc..e07946e 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java @@ -133,7 +133,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "villager", EntityTypes.VILLAGER) .setHologramOffset(-0.025) - .addProperties("hand")); + .addProperties("hand", "villager_type", "villager_profession", "villager_level")); register(builder(p, "witch", EntityTypes.WITCH) .setHologramOffset(-0.025) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java index 04fcf39..fdd4075 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java @@ -1,6 +1,8 @@ package lol.pyr.znpcsplus.packets; +import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.type.EntityType; import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; @@ -215,6 +217,18 @@ public class V1_8PacketFactory implements PacketFactory { else if (entity.getType().equals(EntityTypes.GHAST)) { add(data, metadataFactory.ghastAttacking(properties.getProperty(propertyRegistry.getByName("attacking", Boolean.class)))); } + else if (entity.getType().equals(EntityTypes.VILLAGER)) { + VillagerProfession profession = properties.getProperty(propertyRegistry.getByName("villager_profession", VillagerProfession.class)); + int professionId = profession.ordinal(); + if (PacketEvents.getAPI().getServerManager().getVersion().isOlderThan(ServerVersion.V_1_14)) { + professionId = profession.getLegacyId(); + } + add(data, metadataFactory.villagerData( + properties.getProperty(propertyRegistry.getByName("villager_type", VillagerType.class)).ordinal(), + professionId, + properties.getProperty(propertyRegistry.getByName("villager_level", VillagerLevel.class)).ordinal() + 1 + )); + } if (properties.getProperty(propertyRegistry.getByName("dinnerbone", Boolean.class))) { add(data, metadataFactory.name(Component.text("Dinnerbone")));