diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/hologram/Hologram.java b/src/main/java/io/github/znetworkw/znpcservers/hologram/Hologram.java similarity index 97% rename from src/main/java/io/github/znetworkw/znpcservers/npc/hologram/Hologram.java rename to src/main/java/io/github/znetworkw/znpcservers/hologram/Hologram.java index 9b07682..50a1f43 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/hologram/Hologram.java +++ b/src/main/java/io/github/znetworkw/znpcservers/hologram/Hologram.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.hologram; +package io.github.znetworkw.znpcservers.hologram; import io.github.znetworkw.znpcservers.UnexpectedCallException; import io.github.znetworkw.znpcservers.reflection.Reflections; @@ -6,7 +6,7 @@ import io.github.znetworkw.znpcservers.configuration.Configuration; import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants; import io.github.znetworkw.znpcservers.configuration.ConfigurationValue; import io.github.znetworkw.znpcservers.npc.NPC; -import io.github.znetworkw.znpcservers.npc.hologram.replacer.LineReplacer; +import io.github.znetworkw.znpcservers.hologram.replacer.LineReplacer; import io.github.znetworkw.znpcservers.user.ZUser; import io.github.znetworkw.znpcservers.utility.Utils; import org.bukkit.Location; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/hologram/replacer/LineReplacer.java b/src/main/java/io/github/znetworkw/znpcservers/hologram/replacer/LineReplacer.java similarity index 91% rename from src/main/java/io/github/znetworkw/znpcservers/npc/hologram/replacer/LineReplacer.java rename to src/main/java/io/github/znetworkw/znpcservers/hologram/replacer/LineReplacer.java index 177b4e1..e2944ba 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/hologram/replacer/LineReplacer.java +++ b/src/main/java/io/github/znetworkw/znpcservers/hologram/replacer/LineReplacer.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.hologram.replacer; +package io.github.znetworkw.znpcservers.hologram.replacer; import com.google.common.collect.ImmutableList; import io.github.znetworkw.znpcservers.user.ZUser; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/hologram/replacer/RGBLine.java b/src/main/java/io/github/znetworkw/znpcservers/hologram/replacer/RGBLine.java similarity index 95% rename from src/main/java/io/github/znetworkw/znpcservers/npc/hologram/replacer/RGBLine.java rename to src/main/java/io/github/znetworkw/znpcservers/hologram/replacer/RGBLine.java index 8d2573a..13efc89 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/hologram/replacer/RGBLine.java +++ b/src/main/java/io/github/znetworkw/znpcservers/hologram/replacer/RGBLine.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.hologram.replacer; +package io.github.znetworkw.znpcservers.hologram.replacer; import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants; import io.github.znetworkw.znpcservers.utility.Utils; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMS.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMS.java similarity index 99% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMS.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMS.java index 36b6248..178ae0e 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMS.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMS.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.google.common.collect.ImmutableList; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSFactory.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSFactory.java similarity index 93% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSFactory.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMSFactory.java index 811895d..d3d6827 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSFactory.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSFactory.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.google.common.collect.ImmutableSet; import io.github.znetworkw.znpcservers.utility.Utils; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV16.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV16.java similarity index 95% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV16.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMSV16.java index 5934172..db230e6 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV16.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV16.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV17.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV17.java similarity index 94% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV17.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMSV17.java index 46d25ec..8145b9b 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV17.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV17.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.mojang.authlib.GameProfile; import io.github.znetworkw.znpcservers.reflection.Reflections; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV18.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV18.java similarity index 90% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV18.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMSV18.java index 076c792..be611db 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV18.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV18.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import io.github.znetworkw.znpcservers.reflection.Reflections; import io.github.znetworkw.znpcservers.npc.NPC; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV19.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV19.java similarity index 93% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV19.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMSV19.java index fde6f66..730e7fd 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV19.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV19.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.mojang.authlib.GameProfile; import io.github.znetworkw.znpcservers.reflection.Reflections; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV8.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV8.java similarity index 98% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV8.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMSV8.java index fe73f56..f6aca59 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV8.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV8.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.google.common.collect.ImmutableList; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV9.java b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV9.java similarity index 97% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV9.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/NMSV9.java index 376818b..03314d9 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/NMSV9.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/NMSV9.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.google.common.collect.ImmutableList; import io.github.znetworkw.znpcservers.reflection.Reflections; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/PacketCache.java b/src/main/java/io/github/znetworkw/znpcservers/nms/PacketCache.java similarity index 98% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/PacketCache.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/PacketCache.java index bb9daf7..52fd94f 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/PacketCache.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/PacketCache.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import com.google.common.collect.ImmutableMap; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/PacketValue.java b/src/main/java/io/github/znetworkw/znpcservers/nms/PacketValue.java similarity index 87% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/PacketValue.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/PacketValue.java index a9f4769..25994ab 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/PacketValue.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/PacketValue.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/ValueType.java b/src/main/java/io/github/znetworkw/znpcservers/nms/ValueType.java similarity index 91% rename from src/main/java/io/github/znetworkw/znpcservers/npc/nms/ValueType.java rename to src/main/java/io/github/znetworkw/znpcservers/nms/ValueType.java index 808d9a6..c9437c4 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/nms/ValueType.java +++ b/src/main/java/io/github/znetworkw/znpcservers/nms/ValueType.java @@ -1,4 +1,4 @@ -package io.github.znetworkw.znpcservers.npc.nms; +package io.github.znetworkw.znpcservers.nms; import java.util.Arrays; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/NPC.java b/src/main/java/io/github/znetworkw/znpcservers/npc/NPC.java index 003a336..464ec33 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/NPC.java +++ b/src/main/java/io/github/znetworkw/znpcservers/npc/NPC.java @@ -5,10 +5,10 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.PropertyMap; import io.github.znetworkw.znpcservers.UnexpectedCallException; -import io.github.znetworkw.znpcservers.reflection.Reflections; +import io.github.znetworkw.znpcservers.hologram.Hologram; +import io.github.znetworkw.znpcservers.nms.PacketCache; import io.github.znetworkw.znpcservers.npc.conversation.ConversationModel; -import io.github.znetworkw.znpcservers.npc.hologram.Hologram; -import io.github.znetworkw.znpcservers.npc.nms.PacketCache; +import io.github.znetworkw.znpcservers.reflection.Reflections; import io.github.znetworkw.znpcservers.user.ZUser; import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.location.ZLocation; @@ -75,7 +75,7 @@ public class NPC { this.gameProfile.getProperties().put("textures", new Property("textures", this.npcPojo.getSkin(), this.npcPojo.getSignature())); changeType(this.npcPojo.getNpcType()); updateProfile(this.gameProfile.getProperties()); - setLocation(getNpcPojo().getLocation().bukkitLocation(), false); + setLocation(getNpcPojo().getLocation().toBukkitLocation(), false); this.hologram.createHologram(); if (this.npcPojo.getPathName() != null) setPath(NPCPath.AbstractTypeWriter.find(this.npcPojo.getPathName())); @@ -249,7 +249,7 @@ public class NPC { public void lookAt(ZUser player, Location location, boolean rotation) { long lastMoveNanos = System.nanoTime() - this.lastMove; if (this.lastMove > 1L && lastMoveNanos < 1000000000L) return; - Location direction = rotation ? location : this.npcPojo.getLocation().bukkitLocation().clone().setDirection(location.clone().subtract(this.npcPojo.getLocation().bukkitLocation().clone()).toVector()); + Location direction = rotation ? location : this.npcPojo.getLocation().pointingTo(location); try { Object lookPacket = Reflections.PACKET_PLAY_OUT_ENTITY_LOOK_CONSTRUCTOR.get().newInstance(this.entityID, (byte) (int) (direction.getYaw() * 256.0F / 360.0F), (byte) (int) (direction.getPitch() * 256.0F / 360.0F), true); Object headRotationPacket = Reflections.PACKET_PLAY_OUT_ENTITY_HEAD_ROTATION_CONSTRUCTOR.get().newInstance(this.nmsEntity, (byte) (int) (direction.getYaw() * 256.0F / 360.0F)); @@ -314,7 +314,7 @@ public class NPC { } public Location getLocation() { - if (this.npcPath != null && this.npcPath.getLocation() != null) return this.npcPath.getLocation().bukkitLocation(); - return this.npcPojo.getLocation().bukkitLocation(); + if (this.npcPath != null && this.npcPath.getLocation() != null) return this.npcPath.getLocation().toBukkitLocation(); + return this.npcPojo.getLocation().toBukkitLocation(); } } diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/NPCPath.java b/src/main/java/io/github/znetworkw/znpcservers/npc/NPCPath.java index 6306f5b..952d02f 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/NPCPath.java +++ b/src/main/java/io/github/znetworkw/znpcservers/npc/NPCPath.java @@ -252,7 +252,7 @@ public interface NPCPath { setLocation(location); ZLocation next = getPath().getLocationList().get(getNextLocation()); Vector vector = next.toVector().add(new Vector(0.0D, location.getY() - next.getY(), 0.0D)); - Location direction = next.bukkitLocation().clone().setDirection(location.toVector().subtract(vector) + Location direction = next.toBukkitLocation().clone().setDirection(location.toVector().subtract(vector) .multiply(new Vector(-1, 0, -1))); getNpc().setLocation(direction, false); getNpc().lookAt(null, direction, true); diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/conversation/ConversationProcessor.java b/src/main/java/io/github/znetworkw/znpcservers/npc/conversation/ConversationProcessor.java index d4780b9..fce72a1 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/conversation/ConversationProcessor.java +++ b/src/main/java/io/github/znetworkw/znpcservers/npc/conversation/ConversationProcessor.java @@ -3,7 +3,7 @@ package io.github.znetworkw.znpcservers.npc.conversation; import lol.pyr.znpcsplus.ZNPCsPlus; import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants; import io.github.znetworkw.znpcservers.npc.NPC; -import io.github.znetworkw.znpcservers.npc.hologram.replacer.LineReplacer; +import io.github.znetworkw.znpcservers.hologram.replacer.LineReplacer; import io.github.znetworkw.znpcservers.user.ZUser; import org.bukkit.Bukkit; import org.bukkit.Sound; diff --git a/src/main/java/io/github/znetworkw/znpcservers/npc/task/NPCPositionTask.java b/src/main/java/io/github/znetworkw/znpcservers/npc/task/NPCPositionTask.java index e0f78c6..0d9a4ea 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/npc/task/NPCPositionTask.java +++ b/src/main/java/io/github/znetworkw/znpcservers/npc/task/NPCPositionTask.java @@ -19,6 +19,7 @@ public class NPCPositionTask extends BukkitRunnable { npc.getNpcPath().handle(); } else if (FunctionFactory.isTrue(npc, "look")) for (Player player : Bukkit.getOnlinePlayers()) { + if (!player.getWorld().equals(npc.getLocation().getWorld())) continue; ZUser user = ZUser.find(player); if (npc.getViewers().contains(user)) npc.lookAt(user, player.getLocation(), false); } diff --git a/src/main/java/io/github/znetworkw/znpcservers/utility/location/ZLocation.java b/src/main/java/io/github/znetworkw/znpcservers/utility/location/ZLocation.java index 2cd2d33..22f2032 100644 --- a/src/main/java/io/github/znetworkw/znpcservers/utility/location/ZLocation.java +++ b/src/main/java/io/github/znetworkw/znpcservers/utility/location/ZLocation.java @@ -4,6 +4,8 @@ import com.google.common.base.Preconditions; import com.google.gson.*; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.util.NumberConversions; import org.bukkit.util.Vector; import java.lang.reflect.Type; @@ -16,7 +18,6 @@ public class ZLocation { private final double z; private final float yaw; private final float pitch; - private Location bukkitLocation; public ZLocation(String worldName, double x, double y, double z, float yaw, float pitch) { this.worldName = worldName; @@ -40,6 +41,10 @@ public class ZLocation { return this.worldName; } + public World getWorld() { + return Bukkit.getWorld(this.worldName); + } + public double getX() { return this.x; } @@ -60,15 +65,46 @@ public class ZLocation { return this.pitch; } - public Location bukkitLocation() { - if (this.bukkitLocation != null) - return this.bukkitLocation; - return this - .bukkitLocation = new Location(Bukkit.getWorld(this.worldName), this.x, this.y, this.z, this.yaw, this.pitch); + public Location toBukkitLocation() { + return new Location(getWorld(), this.x, this.y, this.z, this.yaw, this.pitch); } public Vector toVector() { - return bukkitLocation().toVector(); + return new Vector(x, y, z); + } + + private static final double _2PI = 2 * Math.PI; + + public Location pointingTo(Location loc) { + return pointingTo(new ZLocation(loc)).toBukkitLocation(); + } + + public ZLocation pointingTo(ZLocation loc) { + /* + * Sin = Opp / Hyp + * Cos = Adj / Hyp + * Tan = Opp / Adj + * + * x = -Opp + * z = Adj + */ + final double x = loc.getX() - this.x; + final double z = loc.getZ() - this.z; + final double y = loc.getY() - this.y; + + if (x == 0 && z == 0) { + return new ZLocation(worldName, this.x, this.y, this.z, this.yaw, y > 0 ? -90 : 90); + } + + double x2 = NumberConversions.square(x); + double z2 = NumberConversions.square(z); + double xz = Math.sqrt(x2 + z2); + + double theta = Math.atan2(-x, z); + float yaw = (float) Math.toDegrees((theta + _2PI) % _2PI); + float pitch = (float) Math.toDegrees(Math.atan(-y / xz)); + + return new ZLocation(worldName, this.x, this.y, this.z, yaw, pitch); } static class ZLocationSerializer implements JsonSerializer, JsonDeserializer {