diff --git a/plugin/build.gradle b/plugin/build.gradle index 35783cc..7cbf95f 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -19,7 +19,7 @@ dependencies { compileOnly "me.clip:placeholderapi:2.11.6" // Placeholder support implementation "com.google.code.gson:gson:2.10.1" // JSON parsing implementation "org.bstats:bstats-bukkit:3.0.2" // Plugin stats - implementation "com.github.retrooper:packetevents-spigot:2.6.0" // Packets + implementation "com.github.retrooper:packetevents-spigot:2.7.0" // Packets implementation "space.arim.dazzleconf:dazzleconf-ext-snakeyaml:1.2.1" // Configs implementation "lol.pyr:director-adventure:2.1.2" // Commands diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/ArmorStandVehicleProperties.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/ArmorStandVehicleProperties.java new file mode 100644 index 0000000..4e4605a --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/ArmorStandVehicleProperties.java @@ -0,0 +1,76 @@ +package lol.pyr.znpcsplus.entity; + +import io.github.retrooper.packetevents.util.SpigotConversionUtil; +import lol.pyr.znpcsplus.api.entity.EntityProperty; +import lol.pyr.znpcsplus.api.entity.PropertyHolder; +import org.bukkit.inventory.ItemStack; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Represents an armor stand vehicle entity. + *

+ * This entity is used to make the NPC sit on an invisible armor stand. + *

+ */ +public class ArmorStandVehicleProperties implements PropertyHolder { + + private final Map, Object> propertyMap = new HashMap<>(); + + public ArmorStandVehicleProperties(EntityPropertyRegistryImpl propertyRegistry) { + _setProperty(propertyRegistry.getByName("small", Boolean.class), true); + _setProperty(propertyRegistry.getByName("invisible", Boolean.class), true); + _setProperty(propertyRegistry.getByName("base_plate", Boolean.class), false); + } + + @SuppressWarnings("unchecked") + public T getProperty(EntityProperty key) { + return hasProperty(key) ? (T) propertyMap.get((EntityPropertyImpl) key) : key.getDefaultValue(); + } + + @Override + public boolean hasProperty(EntityProperty key) { + return propertyMap.containsKey((EntityPropertyImpl) key); + } + + @SuppressWarnings("unchecked") + private void _setProperty(EntityProperty key, T value) { + Object val = value; + if (val instanceof ItemStack) val = SpigotConversionUtil.fromBukkitItemStack((ItemStack) val); + + setProperty((EntityPropertyImpl) key, (T) val); + } + + @Override + public void setProperty(EntityProperty key, T value) { + throw new UnsupportedOperationException("Cannot set properties on armor stands"); + } + + @Override + public void setItemProperty(EntityProperty key, ItemStack value) { + throw new UnsupportedOperationException("Cannot set item properties on armor stands"); + } + + @Override + public ItemStack getItemProperty(EntityProperty key) { + throw new UnsupportedOperationException("Cannot get item properties on armor stands"); + } + + public void setProperty(EntityPropertyImpl key, T value) { + if (key == null) return; + if (value == null || value.equals(key.getDefaultValue())) propertyMap.remove(key); + else propertyMap.put(key, value); + } + + public Set> getAllProperties() { + return Collections.unmodifiableSet(propertyMap.keySet()); + } + + @Override + public Set> getAppliedProperties() { + return Collections.unmodifiableSet(propertyMap.keySet()); + } +} 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 6bb9b3c..6e02d58 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -182,6 +182,8 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { register(new BooleanProperty("baby", babyIndex, false, legacyBooleans)); } + register(new EntitySittingProperty(packetFactory, this)); + // Player register(new DummyProperty<>("skin", SkinDescriptor.class, false)); final int skinLayersIndex; @@ -665,6 +667,16 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { // Bogged register(new BooleanProperty("bogged_sheared", 16, false, legacyBooleans)); + + if (!ver.isNewerThanOrEquals(ServerVersion.V_1_21_2)) return; + + // Creaking + register(new BooleanProperty("creaking_active", 17, false, legacyBooleans)); + + if (!ver.isNewerThanOrEquals(ServerVersion.V_1_21_4)) return; + + // Creaking + register(new BooleanProperty("creaking_crumbling", 18, false, legacyBooleans)); } private void registerSerializer(PropertySerializer serializer) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java index 4418152..255a201 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java @@ -9,10 +9,10 @@ import lol.pyr.znpcsplus.api.entity.PropertyHolder; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.reflection.Reflections; import lol.pyr.znpcsplus.util.NpcLocation; +import lol.pyr.znpcsplus.util.Viewable; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.util.Collection; import java.util.Set; import java.util.UUID; @@ -20,15 +20,19 @@ public class PacketEntity implements PropertyHolder { private final PacketFactory packetFactory; private final PropertyHolder properties; + private final Viewable viewable; private final int entityId; private final UUID uuid; private final EntityType type; private NpcLocation location; - public PacketEntity(PacketFactory packetFactory, PropertyHolder properties, EntityType type, NpcLocation location) { + private PacketEntity vehicle; + + public PacketEntity(PacketFactory packetFactory, PropertyHolder properties, Viewable viewable, EntityType type, NpcLocation location) { this.packetFactory = packetFactory; this.properties = properties; + this.viewable = viewable; this.entityId = reserveEntityID(); this.uuid = UUID.randomUUID(); this.type = type; @@ -51,22 +55,59 @@ public class PacketEntity implements PropertyHolder { return type; } - public void setLocation(NpcLocation location, Collection viewers) { + public void setLocation(NpcLocation location) { this.location = location; - for (Player viewer : viewers) packetFactory.teleportEntity(viewer, this); + if (vehicle != null) { + vehicle.setLocation(location.withY(location.getY() - 0.9)); + return; + } + for (Player viewer : viewable.getViewers()) packetFactory.teleportEntity(viewer, this); } public void spawn(Player player) { if (type == EntityTypes.PLAYER) packetFactory.spawnPlayer(player, this, properties); else packetFactory.spawnEntity(player, this, properties); + if (vehicle != null) { + vehicle.spawn(player); + packetFactory.setPassenger(player, vehicle, this); + } } public void setHeadRotation(Player player, float yaw, float pitch) { packetFactory.sendHeadRotation(player, this, yaw, pitch); } + public PacketEntity getVehicle() { + return vehicle; + } + + public Viewable getViewable() { + return viewable; + } + + public void setVehicle(PacketEntity vehicle) { + // remove old vehicle + if (this.vehicle != null) { + for (Player player : viewable.getViewers()) { + packetFactory.setPassenger(player, this.vehicle, null); + this.vehicle.despawn(player); + packetFactory.teleportEntity(player, this); + } + } + + this.vehicle = vehicle; + if (this.vehicle == null) return; + + vehicle.setLocation(location.withY(location.getY() - 0.9)); + for (Player player : viewable.getViewers()) { + vehicle.spawn(player); + packetFactory.setPassenger(player, vehicle, this); + } + } + public void despawn(Player player) { packetFactory.destroyEntity(player, this, properties); + if (vehicle != null) vehicle.despawn(player); } public void refreshMeta(Player player) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/EntitySittingProperty.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/EntitySittingProperty.java new file mode 100644 index 0000000..5e59221 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/EntitySittingProperty.java @@ -0,0 +1,37 @@ +package lol.pyr.znpcsplus.entity.properties; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityData; +import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; +import lol.pyr.znpcsplus.entity.ArmorStandVehicleProperties; +import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl; +import lol.pyr.znpcsplus.entity.PacketEntity; +import lol.pyr.znpcsplus.packets.PacketFactory; +import org.bukkit.entity.Player; + +import java.util.Map; + +public class EntitySittingProperty extends EntityPropertyImpl { + private final PacketFactory packetFactory; + private final EntityPropertyRegistryImpl propertyRegistry; + + public EntitySittingProperty(PacketFactory packetFactory, EntityPropertyRegistryImpl propertyRegistry) { + super("entity_sitting", false, Boolean.class); + this.packetFactory = packetFactory; + this.propertyRegistry = propertyRegistry; + } + + @Override + public void apply(Player player, PacketEntity entity, boolean isSpawned, Map properties) { + boolean sitting = entity.getProperty(this); + if (sitting) { + if (entity.getVehicle() == null) { + PacketEntity vehiclePacketEntity = new PacketEntity(packetFactory, new ArmorStandVehicleProperties(propertyRegistry), + entity.getViewable(), EntityTypes.ARMOR_STAND, entity.getLocation().withY(entity.getLocation().getY() - 0.9)); + entity.setVehicle(vehiclePacketEntity); + } + } else if (entity.getVehicle() != null) { + entity.setVehicle(null); + } + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java index 4092e92..c1a4556 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java @@ -38,9 +38,9 @@ public class HologramImpl extends Viewable implements Hologram { } public void addTextLineComponent(Component line) { - HologramText newLine = new HologramText(propertyRegistry, packetFactory, null, line); + HologramText newLine = new HologramText(this, propertyRegistry, packetFactory, null, line); lines.add(newLine); - relocateLines(newLine); + relocateLines(); for (Player viewer : getViewers()) newLine.show(viewer.getPlayer()); } @@ -57,9 +57,9 @@ public class HologramImpl extends Viewable implements Hologram { } public void addItemLinePEStack(ItemStack item) { - HologramItem newLine = new HologramItem(propertyRegistry, packetFactory, null, item); + HologramItem newLine = new HologramItem(this, propertyRegistry, packetFactory, null, item); lines.add(newLine); - relocateLines(newLine); + relocateLines(); for (Player viewer : getViewers()) newLine.show(viewer.getPlayer()); } @@ -99,9 +99,9 @@ public class HologramImpl extends Viewable implements Hologram { } public void insertTextLineComponent(int index, Component line) { - HologramText newLine = new HologramText(propertyRegistry, packetFactory, null, line); + HologramText newLine = new HologramText(this, propertyRegistry, packetFactory, null, line); lines.add(index, newLine); - relocateLines(newLine); + relocateLines(); for (Player viewer : getViewers()) newLine.show(viewer.getPlayer()); } @@ -114,9 +114,9 @@ public class HologramImpl extends Viewable implements Hologram { } public void insertItemLinePEStack(int index, ItemStack item) { - HologramItem newLine = new HologramItem(propertyRegistry, packetFactory, null, item); + HologramItem newLine = new HologramItem(this, propertyRegistry, packetFactory, null, item); lines.add(index, newLine); - relocateLines(newLine); + relocateLines(); for (Player viewer : getViewers()) newLine.show(viewer.getPlayer()); } @@ -172,14 +172,10 @@ public class HologramImpl extends Viewable implements Hologram { } private void relocateLines() { - relocateLines(null); - } - - private void relocateLines(HologramLine newLine) { final double lineSpacing = configManager.getConfig().lineSpacing(); double height = location.getY() + (lines.size() - 1) * lineSpacing + getOffset(); for (HologramLine line : lines) { - line.setLocation(location.withY(height), line == newLine ? Collections.emptySet() : getViewers()); + line.setLocation(location.withY(height)); height -= lineSpacing; } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramItem.java b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramItem.java index c25e434..da17da4 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramItem.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramItem.java @@ -15,13 +15,11 @@ import lol.pyr.znpcsplus.api.entity.EntityProperty; import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.util.NpcLocation; -import org.bukkit.entity.Player; - -import java.util.Collection; +import lol.pyr.znpcsplus.util.Viewable; public class HologramItem extends HologramLine { - public HologramItem(EntityPropertyRegistryImpl propertyRegistry, PacketFactory packetFactory, NpcLocation location, ItemStack item) { - super(item, packetFactory, EntityTypes.ITEM, location); + public HologramItem(Viewable viewable, EntityPropertyRegistryImpl propertyRegistry, PacketFactory packetFactory, NpcLocation location, ItemStack item) { + super(viewable, item, packetFactory, EntityTypes.ITEM, location); addProperty(propertyRegistry.getByName("holo_item")); } @@ -33,8 +31,8 @@ public class HologramItem extends HologramLine { } @Override - public void setLocation(NpcLocation location, Collection viewers) { - super.setLocation(location.withY(location.getY() + 2.05), viewers); + public void setLocation(NpcLocation location) { + super.setLocation(location.withY(location.getY() + 2.05)); } public static boolean ensureValidItemInput(String in) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java index 3b572e5..79e45c1 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java @@ -7,10 +7,10 @@ import lol.pyr.znpcsplus.api.entity.PropertyHolder; import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.util.NpcLocation; +import lol.pyr.znpcsplus.util.Viewable; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -19,9 +19,9 @@ public class HologramLine implements PropertyHolder { private final PacketEntity entity; private final Set> properties; - public HologramLine(M value, PacketFactory packetFactory, EntityType type, NpcLocation location) { + public HologramLine(Viewable viewable, M value, PacketFactory packetFactory, EntityType type, NpcLocation location) { this.value = value; - this.entity = new PacketEntity(packetFactory, this, type, location); + this.entity = new PacketEntity(packetFactory, this, viewable, type, location); this.properties = new HashSet<>(); } @@ -45,8 +45,8 @@ public class HologramLine implements PropertyHolder { entity.despawn(player); } - public void setLocation(NpcLocation location, Collection viewers) { - entity.setLocation(location, viewers); + public void setLocation(NpcLocation location) { + entity.setLocation(location); } public int getEntityId() { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramText.java b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramText.java index 47e5e91..40c8995 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramText.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramText.java @@ -5,6 +5,7 @@ import lol.pyr.znpcsplus.api.entity.EntityProperty; import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.util.NpcLocation; +import lol.pyr.znpcsplus.util.Viewable; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; @@ -12,8 +13,8 @@ public class HologramText extends HologramLine { private static final Component BLANK = Component.text("%blank%"); - public HologramText(EntityPropertyRegistryImpl propertyRegistry, PacketFactory packetFactory, NpcLocation location, Component text) { - super(text, packetFactory, EntityTypes.ARMOR_STAND, location); + public HologramText(Viewable viewable, EntityPropertyRegistryImpl propertyRegistry, PacketFactory packetFactory, NpcLocation location, Component text) { + super(viewable, text, packetFactory, EntityTypes.ARMOR_STAND, location); addProperty(propertyRegistry.getByName("name")); addProperty(propertyRegistry.getByName("invisible")); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java index 4fa6b67..e29948a 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java @@ -48,14 +48,14 @@ public class NpcImpl extends Viewable implements Npc { this.type = type; this.location = location; this.uuid = uuid; - entity = new PacketEntity(packetFactory, this, type.getType(), location); + entity = new PacketEntity(packetFactory, this, this, type.getType(), location); hologram = new HologramImpl(propertyRegistry, configManager, packetFactory, textSerializer, location.withY(location.getY() + type.getHologramOffset())); } public void setType(NpcTypeImpl type) { UNSAFE_hideAll(); this.type = type; - entity = new PacketEntity(packetFactory, this, type.getType(), entity.getLocation()); + entity = new PacketEntity(packetFactory, this, this, type.getType(), entity.getLocation()); hologram.setLocation(location.withY(location.getY() + type.getHologramOffset())); UNSAFE_showAll(); } @@ -85,7 +85,7 @@ public class NpcImpl extends Viewable implements Npc { public void setLocation(NpcLocation location) { this.location = location; - entity.setLocation(location, getViewers()); + entity.setLocation(location); hologram.setLocation(location.withY(location.getY() + type.getHologramOffset())); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java index d072740..bfb259e 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java @@ -176,6 +176,11 @@ public class NpcTypeImpl implements NpcType { addProperties("wolf_variant"); } } + if (version.isNewerThanOrEquals(ServerVersion.V_1_21_4)) { + if (EntityTypes.isTypeInstanceOf(type, EntityTypes.CREAKING)) { + addProperties("creaking_crumbling"); + } + } return new NpcTypeImpl(name, type, hologramOffset, new HashSet<>(allowedProperties), defaultProperties); } } 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 39f52b7..5a23efc 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java @@ -36,7 +36,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "player", EntityTypes.PLAYER) .setHologramOffset(-0.15D) .addEquipmentProperties() - .addProperties("skin_cape", "skin_jacket", "skin_left_sleeve", "skin_right_sleeve", "skin_left_leg", "skin_right_leg", "skin_hat", "shoulder_entity_left", "shoulder_entity_right", "force_body_rotation") + .addProperties("skin_cape", "skin_jacket", "skin_left_sleeve", "skin_right_sleeve", "skin_left_leg", "skin_right_leg", "skin_hat", "shoulder_entity_left", "shoulder_entity_right", "force_body_rotation", "entity_sitting") .addDefaultProperty("skin_cape", true) .addDefaultProperty("skin_jacket", true) .addDefaultProperty("skin_left_sleeve", true) @@ -82,7 +82,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "enderman", EntityTypes.ENDERMAN) .setHologramOffset(0.925) - .addProperties("enderman_held_block", "enderman_screaming", "enderman_staring")); + .addProperties("enderman_held_block", "enderman_screaming", "enderman_staring", "entity_sitting")); register(builder(p, "endermite", EntityTypes.ENDERMITE) .setHologramOffset(-1.675)); @@ -93,7 +93,8 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "giant", EntityTypes.GIANT) .setHologramOffset(10.025) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "guardian", EntityTypes.GUARDIAN) .setHologramOffset(-1.125) @@ -133,7 +134,8 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "skeleton", EntityTypes.SKELETON) .setHologramOffset(0.015) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "skeleton_horse", EntityTypes.SKELETON_HORSE) .setHologramOffset(-0.375)); @@ -169,14 +171,16 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "zombie", EntityTypes.ZOMBIE) .setHologramOffset(-0.025) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "zombie_horse", EntityTypes.ZOMBIE_HORSE) .setHologramOffset(-0.375)); register(builder(p, "zombified_piglin", EntityTypes.ZOMBIFIED_PIGLIN) .setHologramOffset(-0.025) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); if (!version.isNewerThanOrEquals(ServerVersion.V_1_9)) return; @@ -203,17 +207,17 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "husk", EntityTypes.HUSK) .setHologramOffset(-0.025) - .addEquipmentProperties()); - - register(builder(p, "polar_bear", EntityTypes.POLAR_BEAR) - .setHologramOffset(-0.575)); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "stray", EntityTypes.STRAY) .setHologramOffset(0.015) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "evoker", EntityTypes.EVOKER) - .setHologramOffset(-0.025)); + .setHologramOffset(-0.025) + .addProperties("entity_sitting")); register(builder(p, "llama", EntityTypes.LLAMA) .setHologramOffset(-0.105) @@ -225,20 +229,23 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "vindicator", EntityTypes.VINDICATOR) .setHologramOffset(-0.025) - .addProperties("celebrating")); + .addProperties("celebrating", "entity_sitting")); register(builder(p, "wither_skeleton", EntityTypes.WITHER_SKELETON) .setHologramOffset(0.425) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "zombie_villager", EntityTypes.ZOMBIE_VILLAGER) .setHologramOffset(-0.025) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); if (!version.isNewerThanOrEquals(ServerVersion.V_1_12)) return; register(builder(p, "illusioner", EntityTypes.ILLUSIONER) - .setHologramOffset(-0.025)); + .setHologramOffset(-0.025) + .addProperties("entity_sitting")); register(builder(p, "parrot", EntityTypes.PARROT) .setHologramOffset(-1.075) @@ -255,7 +262,8 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "drowned", EntityTypes.DROWNED) .setHologramOffset(-0.025) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "phantom", EntityTypes.PHANTOM) .setHologramOffset(-1.475)); @@ -291,7 +299,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "pillager", EntityTypes.PILLAGER) .setHologramOffset(-0.025) .addHandProperties() - .addProperties("pillager_charging")); + .addProperties("pillager_charging", "entity_sitting")); register(builder(p, "ravager", EntityTypes.RAVAGER) .setHologramOffset(0.225)); @@ -319,11 +327,12 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "piglin", EntityTypes.PIGLIN) .setHologramOffset(-0.025) .addEquipmentProperties() - .addProperties("piglin_baby", "piglin_charging_crossbow", "piglin_dancing")); + .addProperties("piglin_baby", "piglin_charging_crossbow", "piglin_dancing", "entity_sitting")); register(builder(p, "piglin_brute", EntityTypes.PIGLIN_BRUTE) .setHologramOffset(-0.025) - .addEquipmentProperties()); + .addEquipmentProperties() + .addProperties("entity_sitting")); register(builder(p, "strider", EntityTypes.STRIDER) .setHologramOffset(-0.275) @@ -382,10 +391,16 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { register(builder(p, "bogged", EntityTypes.BOGGED) .setHologramOffset(0.015) - .addProperties("bogged_sheared")); + .addProperties("bogged_sheared", "entity_sitting")); register(builder(p, "breeze", EntityTypes.BREEZE) .setHologramOffset(-0.205)); + + if (!version.isNewerThanOrEquals(ServerVersion.V_1_21_2)) return; + + register(builder(p, "creaking", EntityTypes.CREAKING) + .setHologramOffset(0.725) + .addProperties("creaking_active")); } public Collection getAll() { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java index 98cc382..824ef31 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java @@ -24,4 +24,5 @@ public interface PacketFactory { void sendMetadata(Player player, PacketEntity entity, List data); void sendHeadRotation(Player player, PacketEntity entity, float yaw, float pitch); void sendHandSwing(Player player, PacketEntity entity, boolean offHand); + void setPassenger(Player player, PacketEntity vehicle, PacketEntity passenger); } 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 74490ce..e1134f8 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 @@ -153,6 +153,12 @@ public class V1_8PacketFactory implements PacketFactory { sendPacket(player, new WrapperPlayServerEntityEquipment(entity.getEntityId(), Collections.singletonList(equipment))); } + @Override + public void setPassenger(Player player, PacketEntity vehicle, PacketEntity passenger) { + sendPacket(player, new WrapperPlayServerSetPassengers(vehicle.getEntityId(), + passenger == null ? new int[] {} : new int[] {passenger.getEntityId()})); + } + protected void sendPacket(Player player, PacketWrapper packet) { packetEvents.getPlayerManager().sendPacket(player, packet); }