refactoring & fix npc trying to look at players in different worlds

This commit is contained in:
Pyrbu 2023-04-22 20:46:32 +01:00
parent f6940df7d2
commit d79d9f53d1
19 changed files with 68 additions and 31 deletions

@ -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.UnexpectedCallException;
import io.github.znetworkw.znpcservers.reflection.Reflections; 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.ConfigurationConstants;
import io.github.znetworkw.znpcservers.configuration.ConfigurationValue; import io.github.znetworkw.znpcservers.configuration.ConfigurationValue;
import io.github.znetworkw.znpcservers.npc.NPC; 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.user.ZUser;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;
import org.bukkit.Location; import org.bukkit.Location;

@ -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 com.google.common.collect.ImmutableList;
import io.github.znetworkw.znpcservers.user.ZUser; import io.github.znetworkw.znpcservers.user.ZUser;

@ -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.configuration.ConfigurationConstants;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;

@ -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.ImmutableList;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;

@ -1,4 +1,4 @@
package io.github.znetworkw.znpcservers.npc.nms; package io.github.znetworkw.znpcservers.nms;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;

@ -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.ImmutableList;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;

@ -1,4 +1,4 @@
package io.github.znetworkw.znpcservers.npc.nms; package io.github.znetworkw.znpcservers.nms;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.znetworkw.znpcservers.reflection.Reflections; import io.github.znetworkw.znpcservers.reflection.Reflections;

@ -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.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;

@ -1,4 +1,4 @@
package io.github.znetworkw.znpcservers.npc.nms; package io.github.znetworkw.znpcservers.nms;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.znetworkw.znpcservers.reflection.Reflections; import io.github.znetworkw.znpcservers.reflection.Reflections;

@ -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.ImmutableList;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;

@ -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.ImmutableList;
import io.github.znetworkw.znpcservers.reflection.Reflections; import io.github.znetworkw.znpcservers.reflection.Reflections;

@ -1,4 +1,4 @@
package io.github.znetworkw.znpcservers.npc.nms; package io.github.znetworkw.znpcservers.nms;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;

@ -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.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

@ -1,4 +1,4 @@
package io.github.znetworkw.znpcservers.npc.nms; package io.github.znetworkw.znpcservers.nms;
import java.util.Arrays; import java.util.Arrays;

@ -5,10 +5,10 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.Property;
import com.mojang.authlib.properties.PropertyMap; import com.mojang.authlib.properties.PropertyMap;
import io.github.znetworkw.znpcservers.UnexpectedCallException; 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.conversation.ConversationModel;
import io.github.znetworkw.znpcservers.npc.hologram.Hologram; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.nms.PacketCache;
import io.github.znetworkw.znpcservers.user.ZUser; import io.github.znetworkw.znpcservers.user.ZUser;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;
import io.github.znetworkw.znpcservers.utility.location.ZLocation; 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())); this.gameProfile.getProperties().put("textures", new Property("textures", this.npcPojo.getSkin(), this.npcPojo.getSignature()));
changeType(this.npcPojo.getNpcType()); changeType(this.npcPojo.getNpcType());
updateProfile(this.gameProfile.getProperties()); updateProfile(this.gameProfile.getProperties());
setLocation(getNpcPojo().getLocation().bukkitLocation(), false); setLocation(getNpcPojo().getLocation().toBukkitLocation(), false);
this.hologram.createHologram(); this.hologram.createHologram();
if (this.npcPojo.getPathName() != null) if (this.npcPojo.getPathName() != null)
setPath(NPCPath.AbstractTypeWriter.find(this.npcPojo.getPathName())); setPath(NPCPath.AbstractTypeWriter.find(this.npcPojo.getPathName()));
@ -249,7 +249,7 @@ public class NPC {
public void lookAt(ZUser player, Location location, boolean rotation) { public void lookAt(ZUser player, Location location, boolean rotation) {
long lastMoveNanos = System.nanoTime() - this.lastMove; long lastMoveNanos = System.nanoTime() - this.lastMove;
if (this.lastMove > 1L && lastMoveNanos < 1000000000L) return; 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 { 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 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)); 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() { public Location getLocation() {
if (this.npcPath != null && this.npcPath.getLocation() != null) return this.npcPath.getLocation().bukkitLocation(); if (this.npcPath != null && this.npcPath.getLocation() != null) return this.npcPath.getLocation().toBukkitLocation();
return this.npcPojo.getLocation().bukkitLocation(); return this.npcPojo.getLocation().toBukkitLocation();
} }
} }

@ -252,7 +252,7 @@ public interface NPCPath {
setLocation(location); setLocation(location);
ZLocation next = getPath().getLocationList().get(getNextLocation()); ZLocation next = getPath().getLocationList().get(getNextLocation());
Vector vector = next.toVector().add(new Vector(0.0D, location.getY() - next.getY(), 0.0D)); 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))); .multiply(new Vector(-1, 0, -1)));
getNpc().setLocation(direction, false); getNpc().setLocation(direction, false);
getNpc().lookAt(null, direction, true); getNpc().lookAt(null, direction, true);

@ -3,7 +3,7 @@ package io.github.znetworkw.znpcservers.npc.conversation;
import lol.pyr.znpcsplus.ZNPCsPlus; import lol.pyr.znpcsplus.ZNPCsPlus;
import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants; import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants;
import io.github.znetworkw.znpcservers.npc.NPC; 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.user.ZUser;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Sound; import org.bukkit.Sound;

@ -19,6 +19,7 @@ public class NPCPositionTask extends BukkitRunnable {
npc.getNpcPath().handle(); npc.getNpcPath().handle();
} }
else if (FunctionFactory.isTrue(npc, "look")) for (Player player : Bukkit.getOnlinePlayers()) { else if (FunctionFactory.isTrue(npc, "look")) for (Player player : Bukkit.getOnlinePlayers()) {
if (!player.getWorld().equals(npc.getLocation().getWorld())) continue;
ZUser user = ZUser.find(player); ZUser user = ZUser.find(player);
if (npc.getViewers().contains(user)) npc.lookAt(user, player.getLocation(), false); if (npc.getViewers().contains(user)) npc.lookAt(user, player.getLocation(), false);
} }

@ -4,6 +4,8 @@ import com.google.common.base.Preconditions;
import com.google.gson.*; import com.google.gson.*;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.util.NumberConversions;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@ -16,7 +18,6 @@ public class ZLocation {
private final double z; private final double z;
private final float yaw; private final float yaw;
private final float pitch; private final float pitch;
private Location bukkitLocation;
public ZLocation(String worldName, double x, double y, double z, float yaw, float pitch) { public ZLocation(String worldName, double x, double y, double z, float yaw, float pitch) {
this.worldName = worldName; this.worldName = worldName;
@ -40,6 +41,10 @@ public class ZLocation {
return this.worldName; return this.worldName;
} }
public World getWorld() {
return Bukkit.getWorld(this.worldName);
}
public double getX() { public double getX() {
return this.x; return this.x;
} }
@ -60,15 +65,46 @@ public class ZLocation {
return this.pitch; return this.pitch;
} }
public Location bukkitLocation() { public Location toBukkitLocation() {
if (this.bukkitLocation != null) return new Location(getWorld(), this.x, this.y, this.z, this.yaw, this.pitch);
return this.bukkitLocation;
return this
.bukkitLocation = new Location(Bukkit.getWorld(this.worldName), this.x, this.y, this.z, this.yaw, this.pitch);
} }
public Vector toVector() { 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<ZLocation>, JsonDeserializer<ZLocation> { static class ZLocationSerializer implements JsonSerializer<ZLocation>, JsonDeserializer<ZLocation> {