Citizens2/main/src/main/java/net/citizensnpcs/trait/PacketNPC.java

118 lines
3.8 KiB
Java
Raw Normal View History

2023-01-03 13:55:27 +01:00
package net.citizensnpcs.trait;
2023-03-02 16:08:03 +01:00
import org.bukkit.Bukkit;
2023-01-03 13:55:27 +01:00
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.LocationLookup.PerPlayerMetadata;
2023-03-02 16:08:03 +01:00
import net.citizensnpcs.api.event.DespawnReason;
import net.citizensnpcs.api.event.SpawnReason;
2023-01-03 13:55:27 +01:00
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitName;
import net.citizensnpcs.api.util.RemoveReason;
2023-01-03 13:55:27 +01:00
import net.citizensnpcs.npc.EntityController;
import net.citizensnpcs.util.EntityPacketTracker;
2023-01-03 13:55:27 +01:00
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.PlayerUpdateTask;
@TraitName("packet")
public class PacketNPC extends Trait {
private EntityPacketTracker packetTracker;
private boolean spawned = false;
2023-01-03 13:55:27 +01:00
public PacketNPC() {
super("packet");
}
2023-04-16 19:47:32 +02:00
public EntityPacketTracker getPacketTracker() {
return packetTracker;
}
2023-03-02 16:08:03 +01:00
@Override
public void onRemove(RemoveReason reason) {
if (reason == RemoveReason.REMOVAL) {
npc.despawn(DespawnReason.PENDING_RESPAWN);
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), () -> {
if (npc.getStoredLocation() != null) {
npc.spawn(npc.getStoredLocation(), SpawnReason.RESPAWN);
}
});
}
2023-03-02 16:08:03 +01:00
}
2023-01-03 13:55:27 +01:00
@Override
public void onSpawn() {
packetTracker = NMS.createPacketTracker(npc.getEntity());
spawned = true;
2023-01-03 13:55:27 +01:00
}
@Override
public void run() {
if (!spawned)
2023-01-03 13:55:27 +01:00
return;
PerPlayerMetadata<Boolean> ppm = CitizensAPI.getLocationLookup().registerMetadata("packetnpc", null);
for (Player nearby : CitizensAPI.getLocationLookup().getNearbyPlayers(npc)) {
if (!ppm.has(nearby.getUniqueId(), npc.getUniqueId().toString())) {
packetTracker.link(nearby);
ppm.set(nearby.getUniqueId(), npc.getUniqueId().toString(), true);
2023-01-03 13:55:27 +01:00
}
}
packetTracker.run();
2023-01-03 13:55:27 +01:00
}
public EntityController wrap(EntityController controller) {
if (!(controller instanceof PacketController))
return new PacketController(controller);
return controller;
}
2023-01-03 13:55:27 +01:00
private class PacketController implements EntityController {
private final EntityController base;
public PacketController(EntityController controller) {
base = controller;
2023-01-03 13:55:27 +01:00
}
@Override
public void create(Location at, NPC npc) {
base.create(at, npc);
}
@Override
public void die() {
base.die();
if (!spawned)
return;
PlayerUpdateTask.deregisterPlayer(getBukkitEntity());
PerPlayerMetadata<Boolean> ppm = CitizensAPI.getLocationLookup().registerMetadata("packetnpc", null);
packetTracker.unlinkAll(player -> ppm.remove(player.getUniqueId(), npc.getUniqueId().toString()));
spawned = false;
2023-01-03 13:55:27 +01:00
}
@Override
public Entity getBukkitEntity() {
return base.getBukkitEntity();
}
@Override
public void remove() {
if (!spawned)
return;
2023-01-03 13:55:27 +01:00
PlayerUpdateTask.deregisterPlayer(getBukkitEntity());
PerPlayerMetadata<Boolean> ppm = CitizensAPI.getLocationLookup().registerMetadata("packetnpc", null);
packetTracker.unlinkAll(player -> ppm.remove(player.getUniqueId(), npc.getUniqueId().toString()));
2023-01-03 13:55:27 +01:00
base.remove();
spawned = false;
2023-01-03 13:55:27 +01:00
}
@Override
public boolean spawn(Location at) {
NMS.setLocationDirectly(base.getBukkitEntity(), at);
2023-01-03 13:55:27 +01:00
PlayerUpdateTask.registerPlayer(getBukkitEntity());
return true;
}
}
}