From 2588289a19614d5c30aaa770d2cd45796e889ba7 Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Mon, 18 Sep 2023 12:19:33 +0530 Subject: [PATCH] added look_distance and view_distance properties for all npcs --- .../src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java | 2 +- .../znpcsplus/entity/EntityPropertyRegistryImpl.java | 9 ++++++++- .../main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java | 2 +- .../lol/pyr/znpcsplus/tasks/NpcProcessorTask.java | 12 +++++++----- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 47928e6..4fae9cf 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -127,7 +127,7 @@ public class ZNpcsPlus extends JavaPlugin { ConfigManager configManager = new ConfigManager(getDataFolder()); MojangSkinCache skinCache = new MojangSkinCache(configManager); - EntityPropertyRegistryImpl propertyRegistry = new EntityPropertyRegistryImpl(skinCache); + EntityPropertyRegistryImpl propertyRegistry = new EntityPropertyRegistryImpl(skinCache, configManager); PacketFactory packetFactory = setupPacketFactory(scheduler, propertyRegistry); propertyRegistry.registerTypes(packetFactory); 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 d3cd5ce..eaaea72 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -10,6 +10,7 @@ import com.github.retrooper.packetevents.protocol.player.EquipmentSlot; import lol.pyr.znpcsplus.api.entity.EntityProperty; import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.api.skin.SkinDescriptor; +import lol.pyr.znpcsplus.config.ConfigManager; import lol.pyr.znpcsplus.entity.properties.*; import lol.pyr.znpcsplus.entity.properties.villager.VillagerLevelProperty; import lol.pyr.znpcsplus.entity.properties.villager.VillagerProfessionProperty; @@ -42,8 +43,9 @@ import java.util.stream.Collectors; public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { private final Map, PropertySerializer> serializerMap = new HashMap<>(); private final Map> byName = new HashMap<>(); + private final ConfigManager configManager; - public EntityPropertyRegistryImpl(MojangSkinCache skinCache) { + public EntityPropertyRegistryImpl(MojangSkinCache skinCache, ConfigManager configManager) { registerSerializer(new ComponentPropertySerializer()); registerSerializer(new NamedTextColorPropertySerializer()); registerSerializer(new SkinDescriptorSerializer(skinCache)); @@ -77,6 +79,8 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerPrimitiveSerializers(Integer.class, Boolean.class, Double.class, Float.class, Long.class, Short.class, Byte.class, String.class); + this.configManager = configManager; + /* registerType("using_item", false); // TODO: fix it for 1.8 and add new property to use offhand item and riptide animation @@ -144,6 +148,9 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { register(new DinnerboneProperty(legacyNames, optionalComponents)); register(new DummyProperty<>("look", LookType.FIXED)); + register(new DummyProperty<>("look_distance", configManager.getConfig().lookPropertyDistance())); + register(new DummyProperty<>("view_distance", configManager.getConfig().viewDistance())); + register(new GlowProperty(packetFactory)); register(new BitsetProperty("fire", 0, 0x01)); register(new BitsetProperty("invisible", 0, 0x20)); 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 3bc2af7..259341c 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java @@ -110,7 +110,7 @@ public class NpcTypeImpl implements NpcType { public NpcTypeImpl build() { ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion(); - addProperties("fire", "invisible", "silent", "look", + addProperties("fire", "invisible", "silent", "look", "look_distance", "view_distance", "potion_color", "potion_ambient", "dinnerbone"); // TODO: make this look nicer after completing the rest of the properties if (version.isNewerThanOrEquals(ServerVersion.V_1_9)) addProperties("glow"); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java index 5576028..2f45c55 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java @@ -27,9 +27,10 @@ public class NpcProcessorTask extends BukkitRunnable { } public void run() { - double distSq = NumberConversions.square(configManager.getConfig().viewDistance()); - double lookPropertyDistSq = NumberConversions.square(configManager.getConfig().lookPropertyDistance()); + EntityPropertyImpl viewDistanceProperty = propertyRegistry.getByName("view_distance", Integer.class); // Not sure why this is an Integer, but it is EntityPropertyImpl lookProperty = propertyRegistry.getByName("look", LookType.class); + EntityPropertyImpl lookDistanceProperty = propertyRegistry.getByName("look_distance", Double.class); + double lookDistance; for (NpcEntryImpl entry : npcRegistry.getProcessable()) { NpcImpl npc = entry.getNpc(); if (!npc.isEnabled()) continue; @@ -37,6 +38,7 @@ public class NpcProcessorTask extends BukkitRunnable { double closestDist = Double.MAX_VALUE; Player closest = null; LookType lookType = npc.getProperty(lookProperty); + lookDistance = NumberConversions.square(npc.getProperty(lookDistanceProperty)); for (Player player : Bukkit.getOnlinePlayers()) { if (!player.getWorld().equals(npc.getWorld())) { if (npc.isVisibleTo(player)) npc.hide(player); @@ -45,7 +47,7 @@ public class NpcProcessorTask extends BukkitRunnable { double distance = player.getLocation().distanceSquared(npc.getBukkitLocation()); // visibility - boolean inRange = distance <= distSq; + boolean inRange = distance <= NumberConversions.square(npc.getProperty(viewDistanceProperty)); if (!inRange && npc.isVisibleTo(player)) { NpcDespawnEvent event = new NpcDespawnEvent(player, entry); Bukkit.getPluginManager().callEvent(event); @@ -62,7 +64,7 @@ public class NpcProcessorTask extends BukkitRunnable { closestDist = distance; closest = player; } - if (lookType.equals(LookType.PER_PLAYER) && lookPropertyDistSq >= distance) { + if (lookType.equals(LookType.PER_PLAYER) && lookDistance >= distance) { NpcLocation expected = npc.getLocation().lookingAt(player.getLocation().add(0, -npc.getType().getHologramOffset(), 0)); if (!expected.equals(npc.getLocation())) npc.setHeadRotation(player, expected.getYaw(), expected.getPitch()); } @@ -70,7 +72,7 @@ public class NpcProcessorTask extends BukkitRunnable { } // look property if (lookType.equals(LookType.CLOSEST_PLAYER)) { - if (closest != null && lookPropertyDistSq >= closestDist) { + if (closest != null && lookDistance >= closestDist) { NpcLocation expected = npc.getLocation().lookingAt(closest.getLocation().add(0, -npc.getType().getHologramOffset(), 0)); if (!expected.equals(npc.getLocation())) npc.setHeadRotation(expected.getYaw(), expected.getPitch()); }