From 4cc468b9195a3a2c80c9c0f92ff343573c81d540 Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Mon, 3 Jul 2023 11:37:56 +0530 Subject: [PATCH] Implemented Fox properties --- .../java/lol/pyr/znpcsplus/util/FoxVariant.java | 6 ++++++ .../main/java/lol/pyr/znpcsplus/ZNpcsPlus.java | 1 + .../commands/property/PropertySetCommand.java | 1 + .../entity/EntityPropertyRegistryImpl.java | 15 ++++++++------- .../pyr/znpcsplus/metadata/MetadataFactory.java | 4 ++++ .../znpcsplus/metadata/V1_15MetadataFactory.java | 10 ++++++++++ .../znpcsplus/metadata/V1_17MetadataFactory.java | 10 ++++++++++ .../znpcsplus/metadata/V1_8MetadataFactory.java | 10 ++++++++++ .../pyr/znpcsplus/npc/NpcTypeRegistryImpl.java | 2 +- .../pyr/znpcsplus/packets/V1_8PacketFactory.java | 13 ++++++++++++- 10 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/lol/pyr/znpcsplus/util/FoxVariant.java diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/FoxVariant.java b/api/src/main/java/lol/pyr/znpcsplus/util/FoxVariant.java new file mode 100644 index 0000000..5905cdb --- /dev/null +++ b/api/src/main/java/lol/pyr/znpcsplus/util/FoxVariant.java @@ -0,0 +1,6 @@ +package lol.pyr.znpcsplus.util; + +public enum FoxVariant { + RED, + SNOW +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 83fa40c..1e486ea 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -285,6 +285,7 @@ public class ZNpcsPlus extends JavaPlugin { registerEnumParser(manager, CreeperState.class, incorrectUsageMessage); registerEnumParser(manager, ParrotVariant.class, incorrectUsageMessage); registerEnumParser(manager, SpellType.class, incorrectUsageMessage); + registerEnumParser(manager, FoxVariant.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 1ca6fbe..45d921c 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 @@ -126,6 +126,7 @@ public class PropertySetCommand implements CommandHandler { if (type == ParrotVariant.class) return context.suggestEnum(ParrotVariant.values()); if (type == BlockState.class) return context.suggestLiteral("hand", "looking_at", "block"); if (type == SpellType.class) return context.suggestEnum(SpellType.values()); + if (type == FoxVariant.class) return context.suggestEnum(FoxVariant.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 051c1c5..13a4b3d 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -39,6 +39,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerEnumSerializer(CreeperState.class); registerEnumSerializer(ParrotVariant.class); registerEnumSerializer(SpellType.class); + registerEnumSerializer(FoxVariant.class); registerType("glow", NamedTextColor.class); registerType("fire", false); @@ -122,6 +123,13 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { // Evoker registerType("evoker_spell", SpellType.NONE); + // Fox + registerType("fox_variant", FoxVariant.RED); + registerType("fox_sitting", false); + registerType("fox_crouching", false); + registerType("fox_sleeping", false); + registerType("fox_faceplanted", false); + // Pufferfish registerType("puff_state", null); // TODO: Make a puff state enum class @@ -140,13 +148,6 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("carpet_color", DyeColor.class); // TODO registerType("llama_variant", 0); // TODO - // Fox - registerType("fox_variant", 0); // TODO: 0 = red, 1 = snow - registerType("fox_sitting", false); // TODO - registerType("fox_crouching", false); // TODO - registerType("fox_sleeping", false); // TODO - registerType("fox_faceplanting", false); // TODO - // Frog registerType("frog_type", null); // TODO: It has a custom type read on wiki.vg 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 a4a5a08..3b9b694 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java @@ -76,4 +76,8 @@ public interface MetadataFactory { // Evoker EntityData evokerSpell(int spell); + + // Fox + EntityData foxVariant(int variant); + EntityData foxProperties(boolean sitting, boolean crouching, boolean sleeping, boolean facePlanted); } 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 cf30403..ba695f8 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 @@ -103,4 +103,14 @@ public class V1_15MetadataFactory extends V1_14MetadataFactory { public EntityData evokerSpell(int spell) { return newEntityData(16, EntityDataTypes.BYTE, (byte) spell); } + + @Override + public EntityData foxVariant(int variant) { + return newEntityData(16, EntityDataTypes.INT, variant); + } + + @Override + public EntityData foxProperties(boolean sitting, boolean crouching, boolean sleeping, boolean facePlanted) { + return newEntityData(17, EntityDataTypes.BYTE, (byte) ((sitting ? 0x01 : 0) | (crouching ? 0x04 : 0) | (sleeping ? 0x20 : 0) | (facePlanted ? 0x40 : 0))); + } } 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 303ef94..8b93789 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 @@ -163,4 +163,14 @@ public class V1_17MetadataFactory extends V1_16MetadataFactory { public EntityData evokerSpell(int spell) { return newEntityData(17, EntityDataTypes.BYTE, (byte) spell); } + + @Override + public EntityData foxVariant(int variant) { + return newEntityData(17, EntityDataTypes.INT, variant); + } + + @Override + public EntityData foxProperties(boolean sitting, boolean crouching, boolean sleeping, boolean facePlanted) { + return newEntityData(18, EntityDataTypes.BYTE, (byte) ((sitting ? 0x01 : 0) | (crouching ? 0x04 : 0) | (sleeping ? 0x20 : 0) | (facePlanted ? 0x40 : 0))); + } } 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 555a6f4..4cbf6cd 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 @@ -185,6 +185,16 @@ public class V1_8MetadataFactory implements MetadataFactory { throw new UnsupportedOperationException("The evoker spell entity data isn't supported on this version"); } + @Override + public EntityData foxVariant(int variant) { + throw new UnsupportedOperationException("The fox variant entity data isn't supported on this version"); + } + + @Override + public EntityData foxProperties(boolean sitting, boolean crouching, boolean sleeping, boolean facePlanted) { + throw new UnsupportedOperationException("The fox properties entity data isn't supported on this version"); + } + @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/npc/NpcTypeRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java index aec92f3..26deed4 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java @@ -246,7 +246,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "fox", EntityTypes.FOX) .setHologramOffset(-1.275) - .addProperties("hand")); + .addProperties("hand", "fox_variant", "fox_sitting", "fox_crouching", "fox_sleeping", "fox_faceplanted")); register(builder(p, "panda", EntityTypes.PANDA) .setHologramOffset(-0.725)); 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 75b19a4..35ec143 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 @@ -195,9 +195,20 @@ public class V1_8PacketFactory implements PacketFactory { ); add(data, metadataFactory.endermanScreaming(properties.getProperty(propertyRegistry.getByName("enderman_screaming", Boolean.class)))); add(data, metadataFactory.endermanStaring(properties.getProperty(propertyRegistry.getByName("enderman_staring", Boolean.class)))); - } else if (entity.getType().equals(EntityTypes.EVOKER)) { + } + else if (entity.getType().equals(EntityTypes.EVOKER)) { add(data, metadataFactory.evokerSpell(properties.getProperty(propertyRegistry.getByName("evoker_spell", SpellType.class)).ordinal())); } + else if (entity.getType().equals(EntityTypes.FOX)) { + // Not sure if this should be in here or in 1.14 PacketFactory + add(data, metadataFactory.foxVariant(properties.getProperty(propertyRegistry.getByName("fox_variant", FoxVariant.class)).ordinal())); + add(data, metadataFactory.foxProperties( + properties.getProperty(propertyRegistry.getByName("fox_sitting", Boolean.class)), + properties.getProperty(propertyRegistry.getByName("fox_crouching", Boolean.class)), + properties.getProperty(propertyRegistry.getByName("fox_sleeping", Boolean.class)), + properties.getProperty(propertyRegistry.getByName("fox_faceplanted", Boolean.class)) + )); + } if (properties.getProperty(propertyRegistry.getByName("dinnerbone", Boolean.class))) { add(data, metadataFactory.name(Component.text("Dinnerbone")));