added look_distance and view_distance properties for all npcs

This commit is contained in:
D3v1s0m 2023-09-18 12:19:33 +05:30
parent ec4d40563f
commit 2588289a19
No known key found for this signature in database
GPG Key ID: FA1F770C7B1D40C1
4 changed files with 17 additions and 8 deletions

@ -127,7 +127,7 @@ public class ZNpcsPlus extends JavaPlugin {
ConfigManager configManager = new ConfigManager(getDataFolder()); ConfigManager configManager = new ConfigManager(getDataFolder());
MojangSkinCache skinCache = new MojangSkinCache(configManager); MojangSkinCache skinCache = new MojangSkinCache(configManager);
EntityPropertyRegistryImpl propertyRegistry = new EntityPropertyRegistryImpl(skinCache); EntityPropertyRegistryImpl propertyRegistry = new EntityPropertyRegistryImpl(skinCache, configManager);
PacketFactory packetFactory = setupPacketFactory(scheduler, propertyRegistry); PacketFactory packetFactory = setupPacketFactory(scheduler, propertyRegistry);
propertyRegistry.registerTypes(packetFactory); propertyRegistry.registerTypes(packetFactory);

@ -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.EntityProperty;
import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry;
import lol.pyr.znpcsplus.api.skin.SkinDescriptor; 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.*;
import lol.pyr.znpcsplus.entity.properties.villager.VillagerLevelProperty; import lol.pyr.znpcsplus.entity.properties.villager.VillagerLevelProperty;
import lol.pyr.znpcsplus.entity.properties.villager.VillagerProfessionProperty; import lol.pyr.znpcsplus.entity.properties.villager.VillagerProfessionProperty;
@ -42,8 +43,9 @@ import java.util.stream.Collectors;
public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
private final Map<Class<?>, PropertySerializer<?>> serializerMap = new HashMap<>(); private final Map<Class<?>, PropertySerializer<?>> serializerMap = new HashMap<>();
private final Map<String, EntityPropertyImpl<?>> byName = new HashMap<>(); private final Map<String, EntityPropertyImpl<?>> byName = new HashMap<>();
private final ConfigManager configManager;
public EntityPropertyRegistryImpl(MojangSkinCache skinCache) { public EntityPropertyRegistryImpl(MojangSkinCache skinCache, ConfigManager configManager) {
registerSerializer(new ComponentPropertySerializer()); registerSerializer(new ComponentPropertySerializer());
registerSerializer(new NamedTextColorPropertySerializer()); registerSerializer(new NamedTextColorPropertySerializer());
registerSerializer(new SkinDescriptorSerializer(skinCache)); 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); 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 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 DinnerboneProperty(legacyNames, optionalComponents));
register(new DummyProperty<>("look", LookType.FIXED)); 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 GlowProperty(packetFactory));
register(new BitsetProperty("fire", 0, 0x01)); register(new BitsetProperty("fire", 0, 0x01));
register(new BitsetProperty("invisible", 0, 0x20)); register(new BitsetProperty("invisible", 0, 0x20));

@ -110,7 +110,7 @@ public class NpcTypeImpl implements NpcType {
public NpcTypeImpl build() { public NpcTypeImpl build() {
ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion(); 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"); "potion_color", "potion_ambient", "dinnerbone");
// TODO: make this look nicer after completing the rest of the properties // TODO: make this look nicer after completing the rest of the properties
if (version.isNewerThanOrEquals(ServerVersion.V_1_9)) addProperties("glow"); if (version.isNewerThanOrEquals(ServerVersion.V_1_9)) addProperties("glow");

@ -27,9 +27,10 @@ public class NpcProcessorTask extends BukkitRunnable {
} }
public void run() { public void run() {
double distSq = NumberConversions.square(configManager.getConfig().viewDistance()); EntityPropertyImpl<Integer> viewDistanceProperty = propertyRegistry.getByName("view_distance", Integer.class); // Not sure why this is an Integer, but it is
double lookPropertyDistSq = NumberConversions.square(configManager.getConfig().lookPropertyDistance());
EntityPropertyImpl<LookType> lookProperty = propertyRegistry.getByName("look", LookType.class); EntityPropertyImpl<LookType> lookProperty = propertyRegistry.getByName("look", LookType.class);
EntityPropertyImpl<Double> lookDistanceProperty = propertyRegistry.getByName("look_distance", Double.class);
double lookDistance;
for (NpcEntryImpl entry : npcRegistry.getProcessable()) { for (NpcEntryImpl entry : npcRegistry.getProcessable()) {
NpcImpl npc = entry.getNpc(); NpcImpl npc = entry.getNpc();
if (!npc.isEnabled()) continue; if (!npc.isEnabled()) continue;
@ -37,6 +38,7 @@ public class NpcProcessorTask extends BukkitRunnable {
double closestDist = Double.MAX_VALUE; double closestDist = Double.MAX_VALUE;
Player closest = null; Player closest = null;
LookType lookType = npc.getProperty(lookProperty); LookType lookType = npc.getProperty(lookProperty);
lookDistance = NumberConversions.square(npc.getProperty(lookDistanceProperty));
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
if (!player.getWorld().equals(npc.getWorld())) { if (!player.getWorld().equals(npc.getWorld())) {
if (npc.isVisibleTo(player)) npc.hide(player); if (npc.isVisibleTo(player)) npc.hide(player);
@ -45,7 +47,7 @@ public class NpcProcessorTask extends BukkitRunnable {
double distance = player.getLocation().distanceSquared(npc.getBukkitLocation()); double distance = player.getLocation().distanceSquared(npc.getBukkitLocation());
// visibility // visibility
boolean inRange = distance <= distSq; boolean inRange = distance <= NumberConversions.square(npc.getProperty(viewDistanceProperty));
if (!inRange && npc.isVisibleTo(player)) { if (!inRange && npc.isVisibleTo(player)) {
NpcDespawnEvent event = new NpcDespawnEvent(player, entry); NpcDespawnEvent event = new NpcDespawnEvent(player, entry);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
@ -62,7 +64,7 @@ public class NpcProcessorTask extends BukkitRunnable {
closestDist = distance; closestDist = distance;
closest = player; 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)); 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()); if (!expected.equals(npc.getLocation())) npc.setHeadRotation(player, expected.getYaw(), expected.getPitch());
} }
@ -70,7 +72,7 @@ public class NpcProcessorTask extends BukkitRunnable {
} }
// look property // look property
if (lookType.equals(LookType.CLOSEST_PLAYER)) { 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)); NpcLocation expected = npc.getLocation().lookingAt(closest.getLocation().add(0, -npc.getType().getHologramOffset(), 0));
if (!expected.equals(npc.getLocation())) npc.setHeadRotation(expected.getYaw(), expected.getPitch()); if (!expected.equals(npc.getLocation())) npc.setHeadRotation(expected.getYaw(), expected.getPitch());
} }