From ec1d4445e34e0fa985894ec5551d56e9e470bde5 Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Wed, 28 Jun 2023 18:58:09 +0530 Subject: [PATCH] Implemented Creeper Properties --- .../lol/pyr/znpcsplus/util/CreeperState.java | 16 ++++++++++++++++ .../main/java/lol/pyr/znpcsplus/ZNpcsPlus.java | 1 + .../commands/property/PropertySetCommand.java | 2 ++ .../entity/EntityPropertyRegistryImpl.java | 10 ++++++---- .../pyr/znpcsplus/metadata/MetadataFactory.java | 5 +++++ .../znpcsplus/metadata/V1_10MetadataFactory.java | 11 +++++++++++ .../znpcsplus/metadata/V1_14MetadataFactory.java | 11 +++++++++++ .../znpcsplus/metadata/V1_15MetadataFactory.java | 11 +++++++++++ .../znpcsplus/metadata/V1_17MetadataFactory.java | 11 +++++++++++ .../znpcsplus/metadata/V1_8MetadataFactory.java | 11 +++++++++++ .../znpcsplus/metadata/V1_9MetadataFactory.java | 11 +++++++++++ .../pyr/znpcsplus/npc/NpcTypeRegistryImpl.java | 3 ++- .../pyr/znpcsplus/packets/V1_8PacketFactory.java | 9 +++++---- 13 files changed, 103 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/lol/pyr/znpcsplus/util/CreeperState.java diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/CreeperState.java b/api/src/main/java/lol/pyr/znpcsplus/util/CreeperState.java new file mode 100644 index 0000000..2b6a118 --- /dev/null +++ b/api/src/main/java/lol/pyr/znpcsplus/util/CreeperState.java @@ -0,0 +1,16 @@ +package lol.pyr.znpcsplus.util; + +public enum CreeperState { + IDLE(-1), + FUSE(1); + + private final int state; + + CreeperState(int state) { + this.state = state; + } + + public int getState() { + return state; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 7a2781d..b3f021b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -281,6 +281,7 @@ public class ZNpcsPlus extends JavaPlugin { registerEnumParser(manager, NpcPose.class, incorrectUsageMessage); registerEnumParser(manager, DyeColor.class, incorrectUsageMessage); registerEnumParser(manager, CatVariant.class, incorrectUsageMessage); + registerEnumParser(manager, CreeperState.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 aa762b9..23f422b 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 @@ -11,6 +11,7 @@ import lol.pyr.znpcsplus.npc.NpcEntryImpl; import lol.pyr.znpcsplus.npc.NpcImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl; import lol.pyr.znpcsplus.util.CatVariant; +import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.NpcPose; import lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; @@ -84,6 +85,7 @@ public class PropertySetCommand implements CommandHandler { if (type == Color.class) return context.suggestLiteral("0x0F00FF", "#FFFFFF"); if (type == DyeColor.class) return context.suggestEnum(DyeColor.values()); if (type == CatVariant.class) return context.suggestEnum(CatVariant.values()); + if (type == CreeperState.class) return context.suggestEnum(CreeperState.values()); } } return Collections.emptyList(); 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 641f0ad..ef7cfdc 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -7,6 +7,7 @@ import lol.pyr.znpcsplus.api.skin.SkinDescriptor; import lol.pyr.znpcsplus.entity.serializers.*; import lol.pyr.znpcsplus.skin.cache.SkinCache; import lol.pyr.znpcsplus.util.CatVariant; +import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.NpcPose; import lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; @@ -37,6 +38,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerEnumSerializer(NpcPose.class); registerEnumSerializer(DyeColor.class); registerEnumSerializer(CatVariant.class); + registerEnumSerializer(CreeperState.class); registerType("glow", NamedTextColor.class); registerType("fire", false); @@ -105,6 +107,10 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("cat_lying", false); registerType("cat_collar_color", DyeColor.RED); + // Creeper + registerType("creeper_state", CreeperState.IDLE); // TODO: -1 = idle, 1 = fuse + registerType("creeper_charged", false); // TODO + // Pufferfish registerType("puff_state", null); // TODO: Make a puff state enum class @@ -182,10 +188,6 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("piglin_dancing", false); // TODO registerType("piglin_charging_crossbow", false); // TODO - // Creeper - registerType("creeper_state", null); // TODO: -1 = idle, 1 = fuse - registerType("creeper_charged", false); // TODO - // Goat registerType("has_left_horn", true); // TODO registerType("has_right_horn", 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 434b5ae..33e03a2 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.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.pose.EntityPose; import lol.pyr.znpcsplus.util.CatVariant; +import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; import org.bukkit.DyeColor; @@ -61,4 +62,8 @@ public interface MetadataFactory { EntityData catLying(boolean lying); EntityData catTamed(boolean tamed); EntityData catCollarColor(DyeColor collarColor); + + // Creeper + EntityData creeperState(CreeperState state); + EntityData creeperCharged(boolean charged); } 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 c4d5fff..7df916c 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 @@ -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 lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.Vector3f; public class V1_10MetadataFactory extends V1_9MetadataFactory { @@ -69,4 +70,14 @@ public class V1_10MetadataFactory extends V1_9MetadataFactory { public EntityData blazeOnFire(boolean onFire) { return newEntityData(12, EntityDataTypes.BYTE, (byte) (onFire ? 0x01 : 0)); } + + @Override + public EntityData creeperState(CreeperState state) { + return newEntityData(12, EntityDataTypes.INT, state.getState()); + } + + @Override + public EntityData creeperCharged(boolean charged) { + return newEntityData(13, EntityDataTypes.BOOLEAN, charged); + } } 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 26bb329..569b1af 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 @@ -4,6 +4,7 @@ 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 lol.pyr.znpcsplus.util.CatVariant; +import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.Vector3f; import org.bukkit.DyeColor; @@ -92,4 +93,14 @@ public class V1_14MetadataFactory extends V1_13MetadataFactory { public EntityData catCollarColor(DyeColor collarColor) { return newEntityData(20, EntityDataTypes.INT, collarColor.ordinal()); } + + @Override + public EntityData creeperState(CreeperState state) { + return newEntityData(14, EntityDataTypes.INT, state.getState()); + } + + @Override + public EntityData creeperCharged(boolean charged) { + return newEntityData(15, EntityDataTypes.BOOLEAN, charged); + } } 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 63371d9..617044b 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 @@ -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 lol.pyr.znpcsplus.util.CatVariant; +import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.Vector3f; import org.bukkit.DyeColor; @@ -76,4 +77,14 @@ public class V1_15MetadataFactory extends V1_14MetadataFactory { public EntityData catCollarColor(DyeColor collarColor) { return newEntityData(21, EntityDataTypes.INT, collarColor.ordinal()); } + + @Override + public EntityData creeperState(CreeperState state) { + return newEntityData(15, EntityDataTypes.INT, state.getState()); + } + + @Override + public EntityData creeperCharged(boolean charged) { + return newEntityData(16, EntityDataTypes.BOOLEAN, charged); + } } 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 97c33d1..165163e 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 @@ -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 lol.pyr.znpcsplus.util.CatVariant; +import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.Vector3f; import org.bukkit.DyeColor; @@ -121,4 +122,14 @@ public class V1_17MetadataFactory extends V1_16MetadataFactory { public EntityData catCollarColor(DyeColor collarColor) { return newEntityData(22, EntityDataTypes.INT, collarColor.ordinal()); } + + @Override + public EntityData creeperState(CreeperState state) { + return newEntityData(16, EntityDataTypes.INT, state.getState()); + } + + @Override + public EntityData creeperCharged(boolean charged) { + return newEntityData(17, EntityDataTypes.BOOLEAN, charged); + } } 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 0b2d307..c6247f9 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 @@ -6,6 +6,7 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.util.adventure.AdventureSerializer; import lol.pyr.znpcsplus.util.CatVariant; +import lol.pyr.znpcsplus.util.CreeperState; import lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; import org.bukkit.DyeColor; @@ -146,6 +147,16 @@ public class V1_8MetadataFactory implements MetadataFactory { throw new UnsupportedOperationException("The cat collar color entity data isn't supported on this version"); } + @Override + public EntityData creeperState(CreeperState state) { + return newEntityData(16, EntityDataTypes.BYTE, (byte) state.getState()); + } + + @Override + public EntityData creeperCharged(boolean charged) { + return newEntityData(17, EntityDataTypes.BYTE, (byte) (charged ? 1 : 0)); + } + @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 858dc4b..1acc759 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 @@ -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.util.adventure.AdventureSerializer; +import lol.pyr.znpcsplus.util.CreeperState; import net.kyori.adventure.text.Component; public class V1_9MetadataFactory extends V1_8MetadataFactory { @@ -37,6 +38,16 @@ public class V1_9MetadataFactory extends V1_8MetadataFactory { return newEntityData(16, EntityDataTypes.BYTE, (byte) (onFire ? 1 : 0)); } + @Override + public EntityData creeperState(CreeperState state) { + return newEntityData(11, EntityDataTypes.INT, state.getState()); + } + + @Override + public EntityData creeperCharged(boolean charged) { + return newEntityData(12, EntityDataTypes.BOOLEAN, charged); + } + @Override public EntityData name(Component name) { return newEntityData(2, EntityDataTypes.STRING, AdventureSerializer.getGsonSerializer().serialize(name)); 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 ef324cc..235ccde 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java @@ -67,7 +67,8 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { .setHologramOffset(-0.575)); register(builder(p, "creeper", EntityTypes.CREEPER) - .setHologramOffset(-0.275)); + .setHologramOffset(-0.275) + .addProperties("creeper_state", "creeper_charged")); register(builder(p, "donkey", EntityTypes.DONKEY) .setHologramOffset(-0.475)); 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 2708483..0261ba8 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 @@ -16,10 +16,7 @@ import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.metadata.MetadataFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.skin.BaseSkinDescriptor; -import lol.pyr.znpcsplus.util.CatVariant; -import lol.pyr.znpcsplus.util.NpcLocation; -import lol.pyr.znpcsplus.util.PapiUtil; -import lol.pyr.znpcsplus.util.Vector3f; +import lol.pyr.znpcsplus.util.*; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -186,6 +183,10 @@ public class V1_8PacketFactory implements PacketFactory { add(data, metadataFactory.catCollarColor(properties.getProperty(propertyRegistry.getByName("cat_collar_color", DyeColor.class)))); add(data, metadataFactory.catTamed(properties.hasProperty(propertyRegistry.getByName("cat_collar_color", DyeColor.class)))); } + else if (entity.getType().equals(EntityTypes.CREEPER)) { + add(data, metadataFactory.creeperState(properties.getProperty(propertyRegistry.getByName("creeper_state", CreeperState.class)))); + add(data, metadataFactory.creeperCharged(properties.getProperty(propertyRegistry.getByName("creeper_charged", Boolean.class)))); + } if (properties.hasProperty(propertyRegistry.getByName("name"))) { add(data, metadataFactory.name(PapiUtil.set(textSerializer, player, properties.getProperty(propertyRegistry.getByName("name", Component.class))))); add(data, metadataFactory.nameShown());