diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java index 53b4392..25786d4 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java @@ -5,16 +5,13 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType; import lol.pyr.znpcsplus.api.entity.EntityProperty; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public abstract class EntityPropertyImpl implements EntityProperty { private final String name; private final T defaultValue; private final Class clazz; - private final List> dependencies = new ArrayList<>(); + private final Set> dependencies = new HashSet<>(); private boolean playerModifiable = true; protected EntityPropertyImpl(String name, T defaultValue, Class clazz) { 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 d9c3694..1fd4b4b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -11,6 +11,7 @@ import lol.pyr.znpcsplus.entity.serializers.*; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; import lol.pyr.znpcsplus.util.*; +import org.bukkit.Color; import org.bukkit.DyeColor; import java.util.*; @@ -102,13 +103,6 @@ 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); - // Frog registerType("frog_variant", FrogVariant.TEMPERATE); @@ -217,7 +211,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { register(new GlowProperty(packetFactory)); register(new BitsetProperty("fire", 0, 0x01)); register(new BitsetProperty("invisible", 0, 0x20)); - register(new HoloItemProperty()); + register(new HologramItemProperty()); linkProperties("glow", "fire", "invisible"); register(new BooleanProperty("silent", 4, false, legacyBooleans)); @@ -226,7 +220,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { else if (ver.isNewerThanOrEquals(ServerVersion.V_1_14)) potionIndex = 9; else if (ver.isNewerThanOrEquals(ServerVersion.V_1_10)) potionIndex = 8; else potionIndex = 7; - register(new ColorProperty("potion_color", potionIndex++, null)); + register(new EncodedIntegerProperty<>("potion_color", Color.class, potionIndex++, Color::asRGB)); register(new BooleanProperty("potion_ambient", potionIndex, false, legacyBooleans)); // Player @@ -257,13 +251,13 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { register(new BitsetProperty("small", armorStandIndex, 0x01)); register(new BitsetProperty("arms", armorStandIndex, 0x04)); register(new BitsetProperty("base_plate", armorStandIndex++, 0x08, true)); + linkProperties("small", "arms", "base_plate"); register(new RotationProperty("head_rotation", armorStandIndex++, Vector3f.zero())); register(new RotationProperty("body_rotation", armorStandIndex++, Vector3f.zero())); register(new RotationProperty("left_arm_rotation", armorStandIndex++, new Vector3f(-10, 0, -10))); register(new RotationProperty("right_arm_rotation", armorStandIndex++, new Vector3f(-15, 0, 10))); register(new RotationProperty("left_leg_rotation", armorStandIndex++, new Vector3f(-1, 0, -1))); register(new RotationProperty("right_leg_rotation", armorStandIndex, new Vector3f(1, 0, 1))); - linkProperties("small", "arms", "base_plate"); // Ghast final int ghastAttackingIndex; @@ -275,13 +269,32 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { else ghastAttackingIndex = 16; register(new BooleanProperty("attacking", ghastAttackingIndex, false, legacyBooleans)); + if (!ver.isNewerThanOrEquals(ServerVersion.V_1_14)) return; + + // Fox + int foxIndex; + if (ver.isNewerThanOrEquals(ServerVersion.V_1_17)) foxIndex = 17; + else if (ver.isNewerThanOrEquals(ServerVersion.V_1_15)) foxIndex = 16; + else foxIndex = 15; + register(new EncodedIntegerProperty<>("fox_variant", FoxVariant.RED, foxIndex++, Enum::ordinal)); + register(new BitsetProperty("fox_sitting", foxIndex, 0x01)); + register(new BitsetProperty("fox_crouching", foxIndex, 0x04)); + register(new BitsetProperty("fox_sleeping", foxIndex, 0x20)); + linkProperties("fox_sitting", "fox_crouching", "fox_sleeping"); + + if (!ver.isNewerThanOrEquals(ServerVersion.V_1_15)) return; + + register(new BitsetProperty("fox_faceplanted", foxIndex, 0x40)); + linkProperties("fox_sitting", "fox_crouching", "fox_sleeping", "fox_faceplanted"); + + if (!ver.isNewerThanOrEquals(ServerVersion.V_1_17)) return; // Goat register(new BooleanProperty("has_left_horn", 18, true, legacyBooleans)); register(new BooleanProperty("has_right_horn", 19, true, legacyBooleans)); - register(new ShakingProperty(7)); + register(new EncodedIntegerProperty<>("shaking", false,7, enabled -> enabled ? 140 : 0)); } private void registerSerializer(PropertySerializer serializer) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ColorProperty.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ColorProperty.java deleted file mode 100644 index 87ccee6..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ColorProperty.java +++ /dev/null @@ -1,26 +0,0 @@ -package lol.pyr.znpcsplus.entity.properties; - -import com.github.retrooper.packetevents.protocol.entity.data.EntityData; -import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; -import lol.pyr.znpcsplus.entity.EntityPropertyImpl; -import lol.pyr.znpcsplus.entity.PacketEntity; -import org.bukkit.Color; -import org.bukkit.entity.Player; - -import java.util.Map; - -public class ColorProperty extends EntityPropertyImpl { - private final int index; - - public ColorProperty(String name, int index, Color def) { - super(name, def, Color.class); - this.index = index; - } - - @Override - public void apply(Player player, PacketEntity entity, boolean isSpawned, Map properties) { - Color color = entity.getProperty(this); - if (color == null) return; - properties.put(index, newEntityData(index, EntityDataTypes.INT, color.asRGB())); - } -} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/EncodedIntegerProperty.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/EncodedIntegerProperty.java new file mode 100644 index 0000000..a860e09 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/EncodedIntegerProperty.java @@ -0,0 +1,40 @@ +package lol.pyr.znpcsplus.entity.properties; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityData; +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.PacketEntity; +import org.bukkit.entity.Player; + +import java.util.Map; + +public class EncodedIntegerProperty extends EntityPropertyImpl { + private final IntegerDecoder decoder; + private final int index; + + protected EncodedIntegerProperty(String name, T defaultValue, Class clazz, int index, IntegerDecoder decoder) { + super(name, defaultValue, clazz); + this.decoder = decoder; + this.index = index; + } + + @SuppressWarnings("unchecked") + public EncodedIntegerProperty(String name, T defaultValue, int index, IntegerDecoder decoder) { + this(name, defaultValue, (Class) defaultValue.getClass(), index, decoder); + } + + public EncodedIntegerProperty(String name, Class clazz, int index, IntegerDecoder decoder) { + this(name, null, clazz, index, decoder); + } + + @Override + public void apply(Player player, PacketEntity entity, boolean isSpawned, Map properties) { + T value = entity.getProperty(this); + if (value == null) return; + properties.put(index, newEntityData(index, EntityDataTypes.INT, decoder.decode(value))); + } + + public interface IntegerDecoder { + int decode(T obj); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/HoloItemProperty.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/HologramItemProperty.java similarity index 88% rename from plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/HoloItemProperty.java rename to plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/HologramItemProperty.java index cb590c5..f97cbc4 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/HoloItemProperty.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/HologramItemProperty.java @@ -9,9 +9,9 @@ import org.bukkit.entity.Player; import java.util.Map; -public class HoloItemProperty extends EntityPropertyImpl { +public class HologramItemProperty extends EntityPropertyImpl { - public HoloItemProperty() { + public HologramItemProperty() { super("holo_item", null, ItemStack.class); setPlayerModifiable(false); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ShakingProperty.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ShakingProperty.java deleted file mode 100644 index 3d9266a..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ShakingProperty.java +++ /dev/null @@ -1,23 +0,0 @@ -package lol.pyr.znpcsplus.entity.properties; - -import com.github.retrooper.packetevents.protocol.entity.data.EntityData; -import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; -import lol.pyr.znpcsplus.entity.EntityPropertyImpl; -import lol.pyr.znpcsplus.entity.PacketEntity; -import org.bukkit.entity.Player; - -import java.util.Map; - -public class ShakingProperty extends EntityPropertyImpl { - private final int index; - - public ShakingProperty(int index) { - super("shaking", false, Boolean.class); - this.index = index; - } - - @Override - public void apply(Player player, PacketEntity entity, boolean isSpawned, Map properties) { - properties.put(index, newEntityData(index, EntityDataTypes.INT, entity.getProperty(this) ? 140 : 0)); - } -} 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 843fb5a..67db0fc 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java @@ -24,7 +24,6 @@ import org.bukkit.DyeColor; @Deprecated public interface MetadataFactory { - EntityData noGravity(); EntityData pose(EntityPose pose); EntityData usingItem(boolean enabled, boolean offhand, boolean riptide); @@ -64,10 +63,6 @@ public interface MetadataFactory { // Evoker EntityData evokerSpell(int spell); - // Fox - EntityData foxVariant(int variant); - EntityData foxProperties(boolean sitting, boolean crouching, boolean sleeping, boolean facePlanted); - // Frog EntityData frogVariant(int variant); 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 2358af9..7252a3e 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 @@ -7,11 +7,6 @@ import lol.pyr.znpcsplus.util.CreeperState; @Deprecated public class V1_10MetadataFactory extends V1_9MetadataFactory { - @Override - public EntityData noGravity() { - return newEntityData(5, EntityDataTypes.BOOLEAN, true); - } - @Override public EntityData batHanging(boolean hanging) { return newEntityData(12, EntityDataTypes.BYTE, (byte) (hanging ? 0x01 : 0)); 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 edfb880..7744dc0 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 @@ -72,16 +72,6 @@ public class V1_14MetadataFactory extends V1_13MetadataFactory { return newEntityData(15, EntityDataTypes.BYTE, (byte) spell); } - @Override - public EntityData foxVariant(int variant) { - return newEntityData(15, EntityDataTypes.INT, variant); - } - - @Override - public EntityData foxProperties(boolean sitting, boolean crouching, boolean sleeping, boolean facePlanted) { - return newEntityData(16, EntityDataTypes.BYTE, (byte) ((sitting ? 0x01 : 0) | (crouching ? 0x04 : 0) | (sleeping ? 0x20 : 0))); - } - @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 6652a0a..83821e0 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 @@ -70,16 +70,6 @@ public class V1_15MetadataFactory extends V1_14MetadataFactory { 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))); - } - @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 c7bc061..9a9f28d 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 @@ -106,16 +106,6 @@ public class V1_17MetadataFactory extends V1_16MetadataFactory { 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))); - } - @Override public EntityData hoglinImmuneToZombification(boolean immuneToZombification) { return newEntityData(17, EntityDataTypes.BOOLEAN, immuneToZombification); 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 da25b5d..30e8218 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 @@ -10,11 +10,6 @@ import org.bukkit.DyeColor; @Deprecated public class V1_8MetadataFactory implements MetadataFactory { - @Override - public EntityData noGravity() { - throw new UnsupportedOperationException("The gravity entity data isn't supported on this version"); - } - @Override public EntityData pose(EntityPose pose) { throw new UnsupportedOperationException("The pose entity data isn't supported on this version"); @@ -115,16 +110,6 @@ 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 frogVariant(int variant) { throw new UnsupportedOperationException("The frog variant entity data isn't supported on this version");