2020-06-30 12:17:14 +02:00
|
|
|
package net.citizensnpcs.trait;
|
|
|
|
|
2020-07-03 09:14:55 +02:00
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import org.bukkit.Location;
|
2020-06-30 12:17:14 +02:00
|
|
|
import org.bukkit.entity.ArmorStand;
|
|
|
|
import org.bukkit.entity.EntityType;
|
2020-07-03 09:14:55 +02:00
|
|
|
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
|
|
|
|
|
|
|
import com.google.common.collect.Lists;
|
2020-06-30 12:17:14 +02:00
|
|
|
|
2020-07-03 09:14:55 +02:00
|
|
|
import net.citizensnpcs.Settings.Setting;
|
2020-06-30 12:17:14 +02:00
|
|
|
import net.citizensnpcs.api.CitizensAPI;
|
|
|
|
import net.citizensnpcs.api.npc.MemoryNPCDataStore;
|
|
|
|
import net.citizensnpcs.api.npc.NPC;
|
|
|
|
import net.citizensnpcs.api.npc.NPCRegistry;
|
|
|
|
import net.citizensnpcs.api.persistence.Persist;
|
|
|
|
import net.citizensnpcs.api.trait.Trait;
|
|
|
|
import net.citizensnpcs.api.trait.TraitName;
|
|
|
|
import net.citizensnpcs.api.util.Placeholders;
|
2020-07-06 02:42:46 +02:00
|
|
|
import net.citizensnpcs.util.NMS;
|
2020-06-30 12:17:14 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Persists a hologram attached to the NPC.
|
|
|
|
*/
|
|
|
|
@TraitName("hologramtrait")
|
|
|
|
public class HologramTrait extends Trait {
|
2020-07-03 09:14:55 +02:00
|
|
|
private Location currentLoc;
|
|
|
|
private final List<NPC> hologramNPCs = Lists.newArrayList();
|
2020-06-30 12:17:14 +02:00
|
|
|
@Persist
|
2020-07-03 09:14:55 +02:00
|
|
|
private double lineHeight = -1;
|
|
|
|
@Persist
|
|
|
|
private final List<String> lines = Lists.newArrayList();
|
|
|
|
private final NPCRegistry registry = CitizensAPI.createAnonymousNPCRegistry(new MemoryNPCDataStore());
|
2020-06-30 12:17:14 +02:00
|
|
|
|
|
|
|
public HologramTrait() {
|
|
|
|
super("hologramtrait");
|
|
|
|
}
|
|
|
|
|
2020-07-03 09:14:55 +02:00
|
|
|
public void addLine(String text) {
|
|
|
|
lines.add(text);
|
|
|
|
unload();
|
|
|
|
load();
|
|
|
|
}
|
|
|
|
|
2020-07-06 02:42:46 +02:00
|
|
|
private double getEntityHeight() {
|
|
|
|
if (SUPPORT_GET_HEIGHT) {
|
|
|
|
try {
|
|
|
|
return npc.getEntity().getHeight();
|
|
|
|
} catch (NoSuchMethodError err) {
|
|
|
|
SUPPORT_GET_HEIGHT = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NMS.getHeight(npc.getEntity());
|
|
|
|
}
|
|
|
|
|
2020-07-03 09:14:55 +02:00
|
|
|
private double getHeight(int lineNumber) {
|
2020-07-03 16:59:18 +02:00
|
|
|
return (lineHeight == -1 ? Setting.DEFAULT_NPC_HOLOGRAM_LINE_HEIGHT.asDouble() : lineHeight) * (lineNumber + 1);
|
2020-07-03 09:14:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public List<String> getLines() {
|
|
|
|
return lines;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void load() {
|
|
|
|
int i = 0;
|
|
|
|
currentLoc = npc.getStoredLocation();
|
|
|
|
for (String line : lines) {
|
|
|
|
NPC hologramNPC = registry.createNPC(EntityType.ARMOR_STAND, Placeholders.replace(line, null, npc));
|
|
|
|
ArmorStandTrait trait = hologramNPC.getTrait(ArmorStandTrait.class);
|
|
|
|
trait.setVisible(false);
|
|
|
|
trait.setSmall(true);
|
|
|
|
trait.setMarker(true);
|
|
|
|
trait.setGravity(false);
|
|
|
|
trait.setHasArms(false);
|
|
|
|
trait.setHasBaseplate(false);
|
2020-07-06 02:42:46 +02:00
|
|
|
hologramNPC.spawn(currentLoc.clone().add(0, getEntityHeight() + getHeight(i), 0));
|
2020-07-03 09:14:55 +02:00
|
|
|
hologramNPC.getEntity().setInvulnerable(true);
|
|
|
|
hologramNPCs.add(hologramNPC);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-30 12:17:14 +02:00
|
|
|
@Override
|
|
|
|
public void onDespawn() {
|
2020-07-03 09:14:55 +02:00
|
|
|
unload();
|
2020-06-30 12:17:14 +02:00
|
|
|
}
|
|
|
|
|
2020-07-03 16:59:18 +02:00
|
|
|
@Override
|
|
|
|
public void onRemove() {
|
|
|
|
unload();
|
|
|
|
}
|
|
|
|
|
2020-06-30 12:17:14 +02:00
|
|
|
@Override
|
|
|
|
public void onSpawn() {
|
2020-07-03 09:14:55 +02:00
|
|
|
load();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void removeLine(int idx) {
|
|
|
|
lines.remove(idx);
|
|
|
|
unload();
|
|
|
|
load();
|
2020-06-30 12:17:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void run() {
|
2020-07-03 09:14:55 +02:00
|
|
|
if (!npc.isSpawned()) {
|
2020-07-03 16:59:18 +02:00
|
|
|
unload();
|
2020-06-30 12:17:14 +02:00
|
|
|
return;
|
|
|
|
}
|
2020-07-03 16:59:18 +02:00
|
|
|
boolean update = currentLoc.distanceSquared(npc.getStoredLocation()) >= 0.01;
|
2020-07-03 09:14:55 +02:00
|
|
|
if (update) {
|
|
|
|
currentLoc = npc.getStoredLocation();
|
|
|
|
}
|
|
|
|
for (int i = 0; i < hologramNPCs.size(); i++) {
|
|
|
|
NPC hologramNPC = hologramNPCs.get(i);
|
|
|
|
ArmorStand hologram = (ArmorStand) hologramNPC.getEntity();
|
|
|
|
if (hologram == null)
|
|
|
|
continue;
|
|
|
|
if (update) {
|
2020-07-06 02:42:46 +02:00
|
|
|
hologramNPC.teleport(currentLoc.clone().add(0, getEntityHeight() + getHeight(i), 0),
|
2020-07-03 09:14:55 +02:00
|
|
|
TeleportCause.PLUGIN);
|
|
|
|
}
|
|
|
|
String text = lines.get(i);
|
|
|
|
if (text != null && !text.isEmpty()) {
|
|
|
|
hologramNPC.setName(Placeholders.replace(text, null, npc));
|
|
|
|
} else {
|
|
|
|
}
|
2020-06-30 12:17:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-03 09:14:55 +02:00
|
|
|
public void setLine(int idx, String text) {
|
|
|
|
lines.set(idx, text);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setLineHeight(double height) {
|
|
|
|
lineHeight = height;
|
2020-06-30 12:17:14 +02:00
|
|
|
}
|
|
|
|
|
2020-07-03 09:14:55 +02:00
|
|
|
private void unload() {
|
|
|
|
if (hologramNPCs.isEmpty())
|
|
|
|
return;
|
|
|
|
for (NPC npc : hologramNPCs) {
|
|
|
|
npc.destroy();
|
|
|
|
}
|
|
|
|
hologramNPCs.clear();
|
|
|
|
}
|
2020-07-06 02:42:46 +02:00
|
|
|
|
|
|
|
private static boolean SUPPORT_GET_HEIGHT = true;
|
2020-06-30 12:17:14 +02:00
|
|
|
}
|