added look_distance and view_distance properties for all npcs
This commit is contained in:
parent
ec4d40563f
commit
2588289a19
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());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue