Initial refactoring on hologram objects

This commit is contained in:
filoghost 2021-02-26 19:39:29 +01:00
parent c17de21313
commit a295243019
56 changed files with 1090 additions and 1124 deletions

View File

@ -10,7 +10,7 @@ import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.api.internal.BackendAPI; import me.filoghost.holographicdisplays.api.internal.BackendAPI;
import me.filoghost.holographicdisplays.api.placeholder.PlaceholderReplacer; import me.filoghost.holographicdisplays.api.placeholder.PlaceholderReplacer;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.APIHologramManager; import me.filoghost.holographicdisplays.object.api.APIHologramManager;
import me.filoghost.holographicdisplays.placeholder.Placeholder; import me.filoghost.holographicdisplays.placeholder.Placeholder;
import me.filoghost.holographicdisplays.placeholder.PlaceholdersRegister; import me.filoghost.holographicdisplays.placeholder.PlaceholdersRegister;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;

View File

@ -29,11 +29,11 @@ import me.filoghost.holographicdisplays.listener.UpdateNotificationListener;
import me.filoghost.holographicdisplays.nms.interfaces.ItemPickupManager; import me.filoghost.holographicdisplays.nms.interfaces.ItemPickupManager;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.nms.interfaces.PacketController; import me.filoghost.holographicdisplays.nms.interfaces.PacketController;
import me.filoghost.holographicdisplays.object.APIHologram; import me.filoghost.holographicdisplays.object.api.APIHologram;
import me.filoghost.holographicdisplays.object.APIHologramManager; import me.filoghost.holographicdisplays.object.api.APIHologramManager;
import me.filoghost.holographicdisplays.object.BaseHologram; import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import me.filoghost.holographicdisplays.placeholder.AnimationsRegister; import me.filoghost.holographicdisplays.placeholder.AnimationsRegister;
import me.filoghost.holographicdisplays.placeholder.PlaceholdersManager; import me.filoghost.holographicdisplays.placeholder.PlaceholdersManager;
import me.filoghost.holographicdisplays.task.BungeeCleanupTask; import me.filoghost.holographicdisplays.task.BungeeCleanupTask;
@ -175,7 +175,7 @@ public class HolographicDisplays extends FCommonsPlugin implements PacketControl
// Then trigger a refresh for all of them // Then trigger a refresh for all of them
for (BaseHologram hologram : internalHologramManager.getHolograms()) { for (BaseHologram hologram : internalHologramManager.getHolograms()) {
hologram.refreshAll(); hologram.refresh();
} }
} }

View File

@ -20,8 +20,8 @@ import me.filoghost.holographicdisplays.bridge.protocollib.packet.WrapperPlaySer
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.base.BaseHologramLine;
import me.filoghost.holographicdisplays.object.line.TextLineImpl; import me.filoghost.holographicdisplays.object.base.BaseTextLine;
import me.filoghost.holographicdisplays.placeholder.RelativePlaceholder; import me.filoghost.holographicdisplays.placeholder.RelativePlaceholder;
import me.filoghost.holographicdisplays.util.NMSVersion; import me.filoghost.holographicdisplays.util.NMSVersion;
import org.bukkit.World; import org.bukkit.World;
@ -67,7 +67,7 @@ class PacketListener extends PacketAdapter {
// Spawn entity packet // Spawn entity packet
if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY_LIVING) { if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY_LIVING) {
WrapperPlayServerSpawnEntityLiving spawnEntityPacket = new WrapperPlayServerSpawnEntityLiving(packet); WrapperPlayServerSpawnEntityLiving spawnEntityPacket = new WrapperPlayServerSpawnEntityLiving(packet);
HologramLineImpl hologramLine = getHologramLine(event, spawnEntityPacket); BaseHologramLine hologramLine = getHologramLine(event, spawnEntityPacket);
if (hologramLine == null) { if (hologramLine == null) {
return; return;
@ -83,10 +83,10 @@ class PacketListener extends PacketAdapter {
return; return;
} }
if (!(hologramLine instanceof TextLineImpl)) { if (!(hologramLine instanceof BaseTextLine)) {
return; return;
} }
TextLineImpl textLine = (TextLineImpl) hologramLine; BaseTextLine textLine = (BaseTextLine) hologramLine;
if (!hologramLine.getParent().isAllowPlaceholders() || !textLine.hasRelativePlaceholders()) { if (!hologramLine.getParent().isAllowPlaceholders() || !textLine.hasRelativePlaceholders()) {
return; return;
@ -104,7 +104,7 @@ class PacketListener extends PacketAdapter {
} else if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY) { } else if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY) {
WrapperPlayServerSpawnEntity spawnEntityPacket = new WrapperPlayServerSpawnEntity(packet); WrapperPlayServerSpawnEntity spawnEntityPacket = new WrapperPlayServerSpawnEntity(packet);
HologramLineImpl hologramLine = getHologramLine(event, spawnEntityPacket); BaseHologramLine hologramLine = getHologramLine(event, spawnEntityPacket);
if (hologramLine == null) { if (hologramLine == null) {
return; return;
@ -117,7 +117,7 @@ class PacketListener extends PacketAdapter {
} else if (packet.getType() == PacketType.Play.Server.ENTITY_METADATA) { } else if (packet.getType() == PacketType.Play.Server.ENTITY_METADATA) {
WrapperPlayServerEntityMetadata entityMetadataPacket = new WrapperPlayServerEntityMetadata(packet); WrapperPlayServerEntityMetadata entityMetadataPacket = new WrapperPlayServerEntityMetadata(packet);
HologramLineImpl hologramLine = getHologramLine(event, entityMetadataPacket); BaseHologramLine hologramLine = getHologramLine(event, entityMetadataPacket);
if (hologramLine == null) { if (hologramLine == null) {
return; return;
@ -128,10 +128,10 @@ class PacketListener extends PacketAdapter {
return; return;
} }
if (!(hologramLine instanceof TextLineImpl)) { if (!(hologramLine instanceof BaseTextLine)) {
return; return;
} }
TextLineImpl textLine = (TextLineImpl) hologramLine; BaseTextLine textLine = (BaseTextLine) hologramLine;
if (!hologramLine.getParent().isAllowPlaceholders() || !textLine.hasRelativePlaceholders()) { if (!hologramLine.getParent().isAllowPlaceholders() || !textLine.hasRelativePlaceholders()) {
return; return;
@ -183,11 +183,11 @@ class PacketListener extends PacketAdapter {
return true; return true;
} }
private HologramLineImpl getHologramLine(PacketEvent packetEvent, EntityRelatedPacketWrapper packetWrapper) { private BaseHologramLine getHologramLine(PacketEvent packetEvent, EntityRelatedPacketWrapper packetWrapper) {
return getHologramLine(packetEvent.getPlayer().getWorld(), packetWrapper.getEntityID()); return getHologramLine(packetEvent.getPlayer().getWorld(), packetWrapper.getEntityID());
} }
private HologramLineImpl getHologramLine(World world, int entityID) { private BaseHologramLine getHologramLine(World world, int entityID) {
if (entityID < 0) { if (entityID < 0) {
return null; return null;
} }
@ -197,7 +197,7 @@ class PacketListener extends PacketAdapter {
return null; // Entity not existing or not related to holograms. return null; // Entity not existing or not related to holograms.
} }
return (HologramLineImpl) nmsEntity.getHologramLine(); return (BaseHologramLine) nmsEntity.getHologramLine();
} }
} }

View File

@ -18,12 +18,11 @@ import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import me.filoghost.holographicdisplays.object.BaseHologram; import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.base.BaseItemLine;
import me.filoghost.holographicdisplays.object.line.ItemLineImpl; import me.filoghost.holographicdisplays.object.base.BaseTextLine;
import me.filoghost.holographicdisplays.object.line.TextLineImpl; import me.filoghost.holographicdisplays.object.base.BaseTouchableLine;
import me.filoghost.holographicdisplays.object.line.TouchSlimeLineImpl; import me.filoghost.holographicdisplays.object.base.SpawnableHologramLine;
import me.filoghost.holographicdisplays.object.line.TouchableLineImpl;
import me.filoghost.holographicdisplays.util.NMSVersion; import me.filoghost.holographicdisplays.util.NMSVersion;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -40,12 +39,8 @@ class PacketSender {
public void sendDestroyEntitiesPacket(Player player, BaseHologram hologram) { public void sendDestroyEntitiesPacket(Player player, BaseHologram hologram) {
List<Integer> ids = new ArrayList<>(); List<Integer> ids = new ArrayList<>();
for (HologramLineImpl line : hologram.getLinesUnsafe()) { for (SpawnableHologramLine line : hologram.getLinesUnsafe()) {
if (line.isSpawned()) { line.collectEntityIDs(ids);
for (int id : line.getEntitiesIDs()) {
ids.add(id);
}
}
} }
if (!ids.isEmpty()) { if (!ids.isEmpty()) {
@ -54,45 +49,39 @@ class PacketSender {
} }
public void sendCreateEntitiesPacket(Player player, BaseHologram hologram) { public void sendCreateEntitiesPacket(Player player, BaseHologram hologram) {
for (HologramLineImpl line : hologram.getLinesUnsafe()) { for (SpawnableHologramLine line : hologram.getLinesUnsafe()) {
sendCreateEntitiesPacket(player, line); sendCreateEntitiesPacket(player, line);
} }
} }
private void sendCreateEntitiesPacket(Player player, HologramLineImpl line) { private void sendCreateEntitiesPacket(Player player, SpawnableHologramLine line) {
if (!line.isSpawned()) { if (line instanceof BaseTextLine) {
return; BaseTextLine textLine = (BaseTextLine) line;
}
TouchableLineImpl touchableLine; if (textLine.getNMSNameable() != null) {
sendSpawnArmorStandPacket(player, textLine.getNMSNameable());
}
if (line instanceof TextLineImpl) { } else if (line instanceof BaseItemLine) {
TextLineImpl textLine = (TextLineImpl) line; BaseItemLine itemLine = (BaseItemLine) line;
touchableLine = textLine;
sendSpawnArmorStandPacket(player, (NMSArmorStand) textLine.getNmsNameable());
} else if (line instanceof ItemLineImpl) {
ItemLineImpl itemLine = (ItemLineImpl) line;
touchableLine = itemLine;
sendSpawnArmorStandPacket(player, (NMSArmorStand) itemLine.getNmsVehicle());
sendSpawnItemPacket(player, itemLine.getNmsItem());
sendVehicleAttachPacket(player, itemLine.getNmsVehicle(), itemLine.getNmsItem());
sendItemMetadataPacket(player, itemLine.getNmsItem());
if (itemLine.getNMSItem() != null && itemLine.getNMSVehicle() != null) {
sendSpawnArmorStandPacket(player, itemLine.getNMSVehicle());
sendSpawnItemPacket(player, itemLine.getNMSItem());
sendVehicleAttachPacket(player, itemLine.getNMSVehicle(), itemLine.getNMSItem());
sendItemMetadataPacket(player, itemLine.getNMSItem());
}
} else { } else {
throw new IllegalArgumentException("Unexpected hologram line type: " + line.getClass().getName()); throw new IllegalArgumentException("Unexpected hologram line type: " + line.getClass().getName());
} }
if (touchableLine.getTouchSlime() != null) { // All sub-types of lines are touchable, no need to check instance type
TouchSlimeLineImpl touchSlime = touchableLine.getTouchSlime(); BaseTouchableLine touchableLine = (BaseTouchableLine) line;
if (touchSlime.isSpawned()) { if (touchableLine.getNMSSlime() != null && touchableLine.getNMSVehicle() != null) {
sendSpawnArmorStandPacket(player, (NMSArmorStand) touchSlime.getNmsVehicle()); sendSpawnArmorStandPacket(player, touchableLine.getNMSVehicle());
sendSpawnSlimePacket(player, touchSlime.getNmsSlime()); sendSpawnSlimePacket(player, touchableLine.getNMSSlime());
sendVehicleAttachPacket(player, touchSlime.getNmsVehicle(), touchSlime.getNmsSlime()); sendVehicleAttachPacket(player, touchableLine.getNMSVehicle(), touchableLine.getNMSSlime());
}
} }
} }

View File

@ -8,7 +8,7 @@ package me.filoghost.holographicdisplays.bridge.protocollib;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import me.filoghost.fcommons.logging.Log; import me.filoghost.fcommons.logging.Log;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.BaseHologram; import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.util.VersionUtils; import me.filoghost.holographicdisplays.util.VersionUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;

View File

@ -35,8 +35,8 @@ import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.disk.Configuration; import me.filoghost.holographicdisplays.disk.Configuration;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.ComponentBuilder;

View File

@ -10,9 +10,9 @@ import me.filoghost.fcommons.command.validation.CommandValidate;
import me.filoghost.holographicdisplays.common.Utils; import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.HologramLineParser; import me.filoghost.holographicdisplays.disk.HologramLineParser;
import me.filoghost.holographicdisplays.disk.HologramLoadException; import me.filoghost.holographicdisplays.disk.HologramLoadException;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import me.filoghost.holographicdisplays.util.FileUtils; import me.filoghost.holographicdisplays.util.FileUtils;
import java.nio.file.Files; import java.nio.file.Files;
@ -20,7 +20,7 @@ import java.nio.file.Path;
public class HologramCommandValidate { public class HologramCommandValidate {
public static HologramLineImpl parseHologramLine(InternalHologram hologram, String serializedLine, boolean validateMaterial) throws CommandException { public static InternalHologramLine parseHologramLine(InternalHologram hologram, String serializedLine, boolean validateMaterial) throws CommandException {
try { try {
return HologramLineParser.parseLine(hologram, serializedLine, validateMaterial); return HologramLineParser.parseLine(hologram, serializedLine, validateMaterial);
} catch (HologramLoadException e) { } catch (HologramLoadException e) {

View File

@ -13,9 +13,9 @@ import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.common.Utils; import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.event.InternalHologramEditEvent; import me.filoghost.holographicdisplays.event.InternalHologramEditEvent;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -41,9 +41,9 @@ public class AddlineCommand extends LineEditingCommand implements QuickEditComma
InternalHologram hologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[0]); InternalHologram hologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[0]);
String serializedLine = Utils.join(args, " ", 1, args.length); String serializedLine = Utils.join(args, " ", 1, args.length);
HologramLineImpl line = HologramCommandValidate.parseHologramLine(hologram, serializedLine, true); InternalHologramLine line = HologramCommandValidate.parseHologramLine(hologram, serializedLine, true);
hologram.getLinesUnsafe().add(line); hologram.getLinesUnsafe().add(line);
hologram.refreshAll(); hologram.refresh();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -12,8 +12,8 @@ import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -55,9 +55,7 @@ public class AlignCommand extends HologramSubCommand {
throw new CommandException("You must specify either X, Y, Z or XZ, " + axis + " is not a valid axis."); throw new CommandException("You must specify either X, Y, Z or XZ, " + axis + " is not a valid axis.");
} }
hologram.teleport(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ()); hologram.teleport(loc);
hologram.despawnEntities();
hologram.refreshAll();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -11,9 +11,9 @@ import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
public class CopyCommand extends HologramSubCommand { public class CopyCommand extends HologramSubCommand {
@ -37,12 +37,12 @@ public class CopyCommand extends HologramSubCommand {
InternalHologram toHologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[1]); InternalHologram toHologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[1]);
toHologram.clearLines(); toHologram.clearLines();
for (HologramLineImpl line : fromHologram.getLinesUnsafe()) { for (InternalHologramLine line : fromHologram.getLinesUnsafe()) {
HologramLineImpl clonedLine = HologramCommandValidate.parseHologramLine(toHologram, line.getSerializedConfigValue(), false); InternalHologramLine clonedLine = HologramCommandValidate.parseHologramLine(toHologram, line.getSerializedConfigValue(), false);
toHologram.getLinesUnsafe().add(clonedLine); toHologram.getLinesUnsafe().add(clonedLine);
} }
toHologram.refreshAll(); toHologram.refresh();
configManager.getHologramDatabase().addOrUpdate(toHologram); configManager.getHologramDatabase().addOrUpdate(toHologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -13,9 +13,9 @@ import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.common.Utils; import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -63,14 +63,14 @@ public class CreateCommand extends HologramSubCommand {
String text = Utils.join(args, " ", 1, args.length); String text = Utils.join(args, " ", 1, args.length);
CommandValidate.check(!text.equalsIgnoreCase("{empty}"), "The first line should not be empty."); CommandValidate.check(!text.equalsIgnoreCase("{empty}"), "The first line should not be empty.");
HologramLineImpl line = HologramCommandValidate.parseHologramLine(hologram, text, true); InternalHologramLine line = HologramCommandValidate.parseHologramLine(hologram, text, true);
hologram.getLinesUnsafe().add(line); hologram.getLinesUnsafe().add(line);
player.sendMessage(Colors.SECONDARY_SHADOW + "(Change the lines with /" + context.getRootLabel() + " edit " + hologram.getName() + ")"); player.sendMessage(Colors.SECONDARY_SHADOW + "(Change the lines with /" + context.getRootLabel() + " edit " + hologram.getName() + ")");
} else { } else {
hologram.appendTextLine("Default hologram. Change it with " + Colors.PRIMARY + "/" + context.getRootLabel() + " edit " + hologram.getName()); hologram.appendTextLine("Default hologram. Change it with " + Colors.PRIMARY + "/" + context.getRootLabel() + " edit " + hologram.getName());
} }
hologram.refreshAll(); hologram.refresh();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -11,8 +11,8 @@ import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import me.filoghost.holographicdisplays.object.APIHologram; import me.filoghost.holographicdisplays.object.api.APIHologram;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;

View File

@ -11,8 +11,8 @@ import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
public class DeleteCommand extends HologramSubCommand { public class DeleteCommand extends HologramSubCommand {
@ -34,7 +34,7 @@ public class DeleteCommand extends HologramSubCommand {
public void execute(CommandSender sender, String[] args, SubCommandContext context) throws CommandException { public void execute(CommandSender sender, String[] args, SubCommandContext context) throws CommandException {
InternalHologram hologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[0]); InternalHologram hologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[0]);
hologram.delete(); internalHologramManager.deleteHologram(hologram);
configManager.getHologramDatabase().removeHologram(hologram); configManager.getHologramDatabase().removeHologram(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -12,8 +12,8 @@ import me.filoghost.holographicdisplays.commands.HologramCommandManager;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.commands.Messages; import me.filoghost.holographicdisplays.commands.Messages;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.ComponentBuilder;

View File

@ -11,9 +11,9 @@ import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramCommandManager; import me.filoghost.holographicdisplays.commands.HologramCommandManager;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.Messages; import me.filoghost.holographicdisplays.commands.Messages;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
public class InfoCommand extends LineEditingCommand implements QuickEditCommand { public class InfoCommand extends LineEditingCommand implements QuickEditCommand {
@ -39,7 +39,7 @@ public class InfoCommand extends LineEditingCommand implements QuickEditCommand
Messages.sendTitle(sender, "Lines of the hologram '" + hologram.getName() + "'"); Messages.sendTitle(sender, "Lines of the hologram '" + hologram.getName() + "'");
int index = 0; int index = 0;
for (HologramLineImpl line : hologram.getLinesUnsafe()) { for (InternalHologramLine line : hologram.getLinesUnsafe()) {
sender.sendMessage(Colors.SECONDARY + Colors.BOLD + (++index) + Colors.SECONDARY_SHADOW + ". " + Colors.SECONDARY + line.getSerializedConfigValue()); sender.sendMessage(Colors.SECONDARY + Colors.BOLD + (++index) + Colors.SECONDARY_SHADOW + ". " + Colors.SECONDARY + line.getSerializedConfigValue());
} }
commandManager.sendQuickEditCommands(context, hologram); commandManager.sendQuickEditCommands(context, hologram);

View File

@ -15,9 +15,9 @@ import me.filoghost.holographicdisplays.commands.Messages;
import me.filoghost.holographicdisplays.common.Utils; import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.event.InternalHologramEditEvent; import me.filoghost.holographicdisplays.event.InternalHologramEditEvent;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -51,9 +51,9 @@ public class InsertlineCommand extends LineEditingCommand implements QuickEditCo
CommandValidate.check(insertAfter >= 0 && insertAfter <= oldLinesAmount, "The number must be between 0 and " + hologram.size() + "(amount of lines of the hologram)."); CommandValidate.check(insertAfter >= 0 && insertAfter <= oldLinesAmount, "The number must be between 0 and " + hologram.size() + "(amount of lines of the hologram).");
HologramLineImpl line = HologramCommandValidate.parseHologramLine(hologram, serializedLine, true); InternalHologramLine line = HologramCommandValidate.parseHologramLine(hologram, serializedLine, true);
hologram.getLinesUnsafe().add(insertAfter, line); hologram.getLinesUnsafe().add(insertAfter, line);
hologram.refreshAll(); hologram.refresh();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -11,8 +11,8 @@ import me.filoghost.fcommons.command.validation.CommandValidate;
import me.filoghost.holographicdisplays.Colors; import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.commands.Messages; import me.filoghost.holographicdisplays.commands.Messages;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import java.util.List; import java.util.List;

View File

@ -12,8 +12,8 @@ import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -39,9 +39,7 @@ public class MovehereCommand extends HologramSubCommand {
Player player = CommandValidate.getPlayerSender(sender); Player player = CommandValidate.getPlayerSender(sender);
InternalHologram hologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[0]); InternalHologram hologram = HologramCommandValidate.getNamedHologram(internalHologramManager, args[0]);
hologram.teleport(player.getWorld(), player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ()); hologram.teleport(player.getLocation());
hologram.despawnEntities();
hologram.refreshAll();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -11,8 +11,8 @@ import me.filoghost.fcommons.command.validation.CommandValidate;
import me.filoghost.holographicdisplays.Colors; import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.commands.Messages; import me.filoghost.holographicdisplays.commands.Messages;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -44,7 +44,7 @@ public class NearCommand extends HologramSubCommand {
List<InternalHologram> nearHolograms = new ArrayList<>(); List<InternalHologram> nearHolograms = new ArrayList<>();
for (InternalHologram hologram : internalHologramManager.getHolograms()) { for (InternalHologram hologram : internalHologramManager.getHolograms()) {
if (hologram.getLocation().getWorld().equals(world) && hologram.getLocation().distanceSquared(player.getLocation()) <= radiusSquared) { if (hologram.getWorld().equals(world) && hologram.getLocation().distanceSquared(player.getLocation()) <= radiusSquared) {
nearHolograms.add(hologram); nearHolograms.add(hologram);
} }
} }

View File

@ -19,9 +19,9 @@ import me.filoghost.holographicdisplays.image.ImageMessage;
import me.filoghost.holographicdisplays.image.ImageReadException; import me.filoghost.holographicdisplays.image.ImageReadException;
import me.filoghost.holographicdisplays.image.ImageReader; import me.filoghost.holographicdisplays.image.ImageReader;
import me.filoghost.holographicdisplays.image.ImageTooWideException; import me.filoghost.holographicdisplays.image.ImageTooWideException;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import me.filoghost.holographicdisplays.object.line.TextLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalTextLine;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -114,11 +114,10 @@ public class ReadimageCommand extends LineEditingCommand {
hologram.clearLines(); hologram.clearLines();
} }
for (String newLine : newLines) { for (String newLine : newLines) {
TextLineImpl line = new TextLineImpl(hologram, newLine); InternalTextLine line = new InternalTextLine(hologram, newLine, newLine);
line.setSerializedConfigValue(newLine);
hologram.getLinesUnsafe().add(line); hologram.getLinesUnsafe().add(line);
} }
hologram.refreshAll(); hologram.refresh();
if (newLines.length < 5) { if (newLines.length < 5) {
Messages.sendTip(sender, "The image has a very low height. You can increase it by increasing the width, it will scale automatically."); Messages.sendTip(sender, "The image has a very low height. You can increase it by increasing the width, it will scale automatically.");

View File

@ -15,9 +15,9 @@ import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.disk.HologramLineParser; import me.filoghost.holographicdisplays.disk.HologramLineParser;
import me.filoghost.holographicdisplays.disk.HologramLoadException; import me.filoghost.holographicdisplays.disk.HologramLoadException;
import me.filoghost.holographicdisplays.event.InternalHologramEditEvent; import me.filoghost.holographicdisplays.event.InternalHologramEditEvent;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import me.filoghost.holographicdisplays.util.FileUtils; import me.filoghost.holographicdisplays.util.FileUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -73,10 +73,10 @@ public class ReadtextCommand extends LineEditingCommand {
linesAmount = 40; linesAmount = 40;
} }
List<HologramLineImpl> linesToAdd = new ArrayList<>(); List<InternalHologramLine> linesToAdd = new ArrayList<>();
for (int i = 0; i < linesAmount; i++) { for (int i = 0; i < linesAmount; i++) {
try { try {
HologramLineImpl line = HologramLineParser.parseLine(hologram, serializedLines.get(i), true); InternalHologramLine line = HologramLineParser.parseLine(hologram, serializedLines.get(i), true);
linesToAdd.add(line); linesToAdd.add(line);
} catch (HologramLoadException e) { } catch (HologramLoadException e) {
throw new CommandException("Error at line " + (i + 1) + ": " + e.getMessage()); throw new CommandException("Error at line " + (i + 1) + ": " + e.getMessage());
@ -85,7 +85,7 @@ public class ReadtextCommand extends LineEditingCommand {
hologram.clearLines(); hologram.clearLines();
hologram.getLinesUnsafe().addAll(linesToAdd); hologram.getLinesUnsafe().addAll(linesToAdd);
hologram.refreshAll(); hologram.refresh();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -13,8 +13,8 @@ import me.filoghost.holographicdisplays.commands.HologramCommandManager;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.event.InternalHologramEditEvent; import me.filoghost.holographicdisplays.event.InternalHologramEditEvent;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -47,7 +47,7 @@ public class RemovelineCommand extends LineEditingCommand implements QuickEditCo
CommandValidate.check(hologram.size() > 1, "The hologram should have at least 1 line. If you want to delete it, use /" + context.getRootLabel() + " delete."); CommandValidate.check(hologram.size() > 1, "The hologram should have at least 1 line. If you want to delete it, use /" + context.getRootLabel() + " delete.");
hologram.removeLine(index); hologram.removeLine(index);
hologram.refreshAll(); hologram.refresh();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -14,9 +14,9 @@ import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.common.Utils; import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.ConfigManager; import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.event.InternalHologramEditEvent; import me.filoghost.holographicdisplays.event.InternalHologramEditEvent;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -46,11 +46,11 @@ public class SetlineCommand extends LineEditingCommand implements QuickEditComma
CommandValidate.check(lineNumber >= 1 && lineNumber <= hologram.size(), "The line number must be between 1 and " + hologram.size() + "."); CommandValidate.check(lineNumber >= 1 && lineNumber <= hologram.size(), "The line number must be between 1 and " + hologram.size() + ".");
int index = lineNumber - 1; int index = lineNumber - 1;
HologramLineImpl line = HologramCommandValidate.parseHologramLine(hologram, serializedLine, true); InternalHologramLine line = HologramCommandValidate.parseHologramLine(hologram, serializedLine, true);
hologram.getLinesUnsafe().get(index).despawn(); InternalHologramLine prevLine = hologram.getLinesUnsafe().set(index, line);
hologram.getLinesUnsafe().set(index, line); prevLine.despawn();
hologram.refreshAll(); hologram.refresh();
configManager.getHologramDatabase().addOrUpdate(hologram); configManager.getHologramDatabase().addOrUpdate(hologram);
configManager.saveHologramDatabase(); configManager.saveHologramDatabase();

View File

@ -11,8 +11,8 @@ import me.filoghost.fcommons.command.validation.CommandValidate;
import me.filoghost.holographicdisplays.Colors; import me.filoghost.holographicdisplays.Colors;
import me.filoghost.holographicdisplays.commands.HologramCommandValidate; import me.filoghost.holographicdisplays.commands.HologramCommandValidate;
import me.filoghost.holographicdisplays.commands.HologramSubCommand; import me.filoghost.holographicdisplays.commands.HologramSubCommand;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -7,9 +7,9 @@ package me.filoghost.holographicdisplays.disk;
import me.filoghost.fcommons.Strings; import me.filoghost.fcommons.Strings;
import me.filoghost.fcommons.config.ConfigSection; import me.filoghost.fcommons.config.ConfigSection;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
@ -38,7 +38,7 @@ public class HologramConfig {
public HologramConfig(InternalHologram hologram) { public HologramConfig(InternalHologram hologram) {
this.name = hologram.getName(); this.name = hologram.getName();
this.serializedLines = new ArrayList<>(); this.serializedLines = new ArrayList<>();
for (HologramLineImpl line : hologram.getLinesUnsafe()) { for (InternalHologramLine line : hologram.getLinesUnsafe()) {
serializedLines.add(line.getSerializedConfigValue()); serializedLines.add(line.getSerializedConfigValue());
} }
@ -65,7 +65,7 @@ public class HologramConfig {
for (String serializedLine : serializedLines) { for (String serializedLine : serializedLines) {
try { try {
HologramLineImpl line = HologramLineParser.parseLine(hologram, serializedLine, false); InternalHologramLine line = HologramLineParser.parseLine(hologram, serializedLine, false);
hologram.getLinesUnsafe().add(line); hologram.getLinesUnsafe().add(line);
} catch (HologramLoadException e) { } catch (HologramLoadException e) {
// Rethrow with more details // Rethrow with more details

View File

@ -7,7 +7,7 @@ package me.filoghost.holographicdisplays.disk;
import me.filoghost.fcommons.config.Config; import me.filoghost.fcommons.config.Config;
import me.filoghost.fcommons.config.ConfigSection; import me.filoghost.fcommons.config.ConfigSection;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;

View File

@ -9,10 +9,10 @@ import me.filoghost.fcommons.MaterialsHelper;
import me.filoghost.fcommons.Strings; import me.filoghost.fcommons.Strings;
import me.filoghost.holographicdisplays.nbt.parser.MojangsonParseException; import me.filoghost.holographicdisplays.nbt.parser.MojangsonParseException;
import me.filoghost.holographicdisplays.nbt.parser.MojangsonParser; import me.filoghost.holographicdisplays.nbt.parser.MojangsonParser;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalHologramLine;
import me.filoghost.holographicdisplays.object.line.ItemLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalItemLine;
import me.filoghost.holographicdisplays.object.line.TextLineImpl; import me.filoghost.holographicdisplays.object.internal.InternalTextLine;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -21,23 +21,22 @@ public class HologramLineParser {
private static final String ICON_PREFIX = "icon:"; private static final String ICON_PREFIX = "icon:";
public static HologramLineImpl parseLine(InternalHologram hologram, String serializedLine, boolean checkMaterialValidity) throws HologramLoadException { public static InternalHologramLine parseLine(InternalHologram hologram, String serializedLine, boolean checkMaterialValidity) throws HologramLoadException {
HologramLineImpl hologramLine; InternalHologramLine hologramLine;
if (serializedLine.toLowerCase().startsWith(ICON_PREFIX)) { if (serializedLine.toLowerCase().startsWith(ICON_PREFIX)) {
String serializedIcon = serializedLine.substring(ICON_PREFIX.length()); String serializedIcon = serializedLine.substring(ICON_PREFIX.length());
ItemStack icon = parseItemStack(serializedIcon, checkMaterialValidity); ItemStack icon = parseItemStack(serializedIcon, checkMaterialValidity);
hologramLine = new ItemLineImpl(hologram, icon); hologramLine = new InternalItemLine(hologram, icon, serializedLine);
} else { } else {
if (serializedLine.trim().equalsIgnoreCase("{empty}")) { if (serializedLine.trim().equalsIgnoreCase("{empty}")) {
hologramLine = new TextLineImpl(hologram, ""); hologramLine = new InternalTextLine(hologram, "", serializedLine);
} else { } else {
hologramLine = new TextLineImpl(hologram, StringConverter.toReadableFormat(serializedLine)); hologramLine = new InternalTextLine(hologram, StringConverter.toReadableFormat(serializedLine), serializedLine);
} }
} }
hologramLine.setSerializedConfigValue(serializedLine);
return hologramLine; return hologramLine;
} }

View File

@ -5,7 +5,7 @@
*/ */
package me.filoghost.holographicdisplays.event; package me.filoghost.holographicdisplays.event;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;

View File

@ -2,9 +2,9 @@ package me.filoghost.holographicdisplays.listener;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import me.filoghost.holographicdisplays.object.APIHologramManager; import me.filoghost.holographicdisplays.object.api.APIHologramManager;
import me.filoghost.holographicdisplays.object.BaseHologram; import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import me.filoghost.holographicdisplays.util.SchedulerUtils; import me.filoghost.holographicdisplays.util.SchedulerUtils;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;

View File

@ -9,8 +9,8 @@ import me.filoghost.fcommons.logging.Log;
import me.filoghost.holographicdisplays.HolographicDisplays; import me.filoghost.holographicdisplays.HolographicDisplays;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import me.filoghost.holographicdisplays.object.APIHologram; import me.filoghost.holographicdisplays.object.api.APIHologram;
import me.filoghost.holographicdisplays.object.line.TouchSlimeLineImpl; import me.filoghost.holographicdisplays.object.base.BaseTouchableLine;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -46,12 +46,12 @@ public class MainListener implements Listener {
} }
NMSEntityBase entityBase = nmsManager.getNMSEntityBase(event.getRightClicked()); NMSEntityBase entityBase = nmsManager.getNMSEntityBase(event.getRightClicked());
if (entityBase == null || !(entityBase.getHologramLine() instanceof TouchSlimeLineImpl)) { if (entityBase == null || !(entityBase.getHologramLine() instanceof BaseTouchableLine)) {
return; return;
} }
TouchSlimeLineImpl touchSlime = (TouchSlimeLineImpl) entityBase.getHologramLine(); BaseTouchableLine touchableLine = (BaseTouchableLine) entityBase.getHologramLine();
if (touchSlime.getTouchablePiece().getTouchHandler() == null || !touchSlime.getParent().getVisibilityManager().isVisibleTo(clicker)) { if (touchableLine.getTouchHandler() == null || !touchableLine.getParent().getVisibilityManager().isVisibleTo(clicker)) {
return; return;
} }
@ -63,9 +63,9 @@ public class MainListener implements Listener {
anticlickSpam.put(event.getPlayer(), System.currentTimeMillis()); anticlickSpam.put(event.getPlayer(), System.currentTimeMillis());
try { try {
touchSlime.getTouchablePiece().getTouchHandler().onTouch(event.getPlayer()); touchableLine.getTouchHandler().onTouch(event.getPlayer());
} catch (Throwable t) { } catch (Throwable t) {
Plugin plugin = touchSlime.getParent() instanceof APIHologram ? ((APIHologram) touchSlime.getParent()).getOwner() : HolographicDisplays.getInstance(); Plugin plugin = touchableLine.getParent() instanceof APIHologram ? ((APIHologram) touchableLine.getParent()).getOwner() : HolographicDisplays.getInstance();
Log.warning("The plugin " + plugin.getName() + " generated an exception when the player " + event.getPlayer().getName() + " touched a hologram.", t); Log.warning("The plugin " + plugin.getName() + " generated an exception when the player " + event.getPlayer().getName() + " touched a hologram.", t);
} }
} }

View File

@ -1,34 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import org.bukkit.Location;
import org.bukkit.plugin.Plugin;
public class APIHologram extends BaseHologram {
private final Plugin plugin;
private final APIHologramManager apiHologramManager;
protected APIHologram(Location source, Plugin plugin, NMSManager nmsManager, APIHologramManager apiHologramManager) {
super(source, nmsManager);
Preconditions.notNull(plugin, "plugin");
this.plugin = plugin;
this.apiHologramManager = apiHologramManager;
}
public Plugin getOwner() {
return plugin;
}
@Override
public void delete() {
apiHologramManager.deleteHologram(this);
}
}

View File

@ -1,354 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.api.VisibilityManager;
import me.filoghost.holographicdisplays.api.line.HologramLine;
import me.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.Configuration;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.line.HologramLineImpl;
import me.filoghost.holographicdisplays.object.line.ItemLineImpl;
import me.filoghost.holographicdisplays.object.line.TextLineImpl;
import me.filoghost.holographicdisplays.placeholder.PlaceholdersManager;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseHologram implements Hologram {
private final NMSManager nmsManager;
// Position variables.
private World world;
private double x, y, z;
private int chunkX, chunkZ;
// The entities that represent lines.
private final List<HologramLineImpl> lines;
private final VisibilityManager visibilityManager;
private boolean allowPlaceholders;
private final long creationTimestamp;
private boolean deleted;
public BaseHologram(Location location, NMSManager nmsManager) {
Preconditions.notNull(location, "location");
setLocation(location.getWorld(), location.getX(), location.getY(), location.getZ());
this.nmsManager = nmsManager;
this.lines = new ArrayList<>();
this.creationTimestamp = System.currentTimeMillis();
this.visibilityManager = new VisibilityManagerImpl(this);
this.allowPlaceholders = false;
}
public boolean isInChunk(Chunk chunk) {
return chunk.getWorld() == world && chunk.getX() == chunkX && chunk.getZ() == chunkZ;
}
@Override
public World getWorld() {
return world;
}
@Override
public double getX() {
return x;
}
@Override
public double getY() {
return y;
}
@Override
public double getZ() {
return z;
}
@Override
public Location getLocation() {
return new Location(world, x, y, z);
}
private void setLocation(World world, double x, double y, double z) {
Preconditions.notNull(world, "world");
this.world = world;
this.x = x;
this.y = y;
this.z = z;
chunkX = Utils.floor(x) >> 4;
chunkZ = Utils.floor(z) >> 4;
}
@Override
public boolean isDeleted() {
return deleted;
}
public void setDeleted() {
if (!deleted) {
deleted = true;
clearLines();
}
}
public List<HologramLineImpl> getLinesUnsafe() {
return lines;
}
@Override
public HologramLine getLine(int index) {
return lines.get(index);
}
@Override
public TextLine appendTextLine(String text) {
checkState();
TextLineImpl line = new TextLineImpl(this, text);
lines.add(line);
refreshSingleLines();
return line;
}
@Override
public ItemLine appendItemLine(ItemStack itemStack) {
checkState();
Preconditions.notNull(itemStack, "itemStack");
ItemLineImpl line = new ItemLineImpl(this, itemStack);
lines.add(line);
refreshSingleLines();
return line;
}
@Override
public TextLine insertTextLine(int index, String text) {
checkState();
TextLineImpl line = new TextLineImpl(this, text);
lines.add(index, line);
refreshSingleLines();
return line;
}
@Override
public ItemLine insertItemLine(int index, ItemStack itemStack) {
checkState();
Preconditions.notNull(itemStack, "itemStack");
ItemLineImpl line = new ItemLineImpl(this, itemStack);
lines.add(index, line);
refreshSingleLines();
return line;
}
@Override
public void removeLine(int index) {
checkState();
lines.remove(index).despawn();
refreshSingleLines();
}
public void removeLine(HologramLineImpl line) {
checkState();
lines.remove(line);
line.despawn();
refreshSingleLines();
}
@Override
public void clearLines() {
for (HologramLineImpl line : lines) {
line.despawn();
}
lines.clear();
}
@Override
public int size() {
return lines.size();
}
@Override
public double getHeight() {
if (lines.isEmpty()) {
return 0;
}
double height = 0.0;
for (HologramLineImpl line : lines) {
height += line.getHeight();
}
height += Configuration.spaceBetweenLines * (lines.size() - 1);
return height;
}
@Override
public VisibilityManager getVisibilityManager() {
return visibilityManager;
}
@Override
public long getCreationTimestamp() {
return creationTimestamp;
}
@Override
public boolean isAllowPlaceholders() {
return allowPlaceholders;
}
@Override
public void setAllowPlaceholders(boolean allowPlaceholders) {
if (this.allowPlaceholders == allowPlaceholders) {
return;
}
this.allowPlaceholders = allowPlaceholders;
refreshAll();
}
public NMSManager getNMSManager() {
return nmsManager;
}
public void refreshAll() {
if (world.isChunkLoaded(chunkX, chunkZ)) {
spawnEntities();
}
}
public void refreshSingleLines() {
if (world.isChunkLoaded(chunkX, chunkZ)) {
double currentY = this.y;
boolean first = true;
for (HologramLineImpl line : lines) {
currentY -= line.getHeight();
if (first) {
first = false;
} else {
currentY -= Configuration.spaceBetweenLines;
}
if (line.isSpawned()) {
line.teleport(x, currentY, z);
} else {
line.spawn(world, x, currentY, z);
if (allowPlaceholders && line instanceof TextLineImpl) {
PlaceholdersManager.trackIfNecessary((TextLineImpl) line);
}
}
}
}
}
/**
* Forces the entities to (re)spawn, without checking if the chunk is loaded.
*/
public void spawnEntities() {
checkState();
despawnEntities();
double currentY = this.y;
boolean first = true;
for (HologramLineImpl line : lines) {
currentY -= line.getHeight();
if (first) {
first = false;
} else {
currentY -= Configuration.spaceBetweenLines;
}
line.spawn(world, x, currentY, z);
if (allowPlaceholders && line instanceof TextLineImpl) {
PlaceholdersManager.trackIfNecessary((TextLineImpl) line);
}
}
}
public void despawnEntities() {
for (HologramLineImpl piece : lines) {
piece.despawn();
}
}
@Override
public void teleport(Location location) {
Preconditions.notNull(location, "location");
teleport(location.getWorld(), location.getX(), location.getY(), location.getZ());
}
@Override
public void teleport(World world, double x, double y, double z) {
checkState();
Preconditions.notNull(world, "world");
setLocation(world, x, y, z);
if (this.world != world) {
despawnEntities();
refreshAll();
return;
}
double currentY = y;
boolean first = true;
for (HologramLineImpl line : lines) {
if (!line.isSpawned()) {
continue;
}
currentY -= line.getHeight();
if (first) {
first = false;
} else {
currentY -= Configuration.spaceBetweenLines;
}
line.teleport(x, currentY, z);
}
}
private void checkState() {
Preconditions.checkState(!deleted, "hologram already deleted");
}
@Override
public String toString() {
return "BaseHologram [world=" + world + ", x=" + x + ", y=" + y + ", z=" + z + ", lines=" + lines + ", deleted=" + deleted + "]";
}
/*
* Object.equals() and Object.hashCode() are not overridden:
* two holograms are equal only if they are the same exact instance.
*/
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.common.Utils;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
public abstract class HologramComponent {
private World world;
private double x, y, z;
private int chunkX, chunkZ;
public boolean isInChunk(Chunk chunk) {
return world != null
&& chunk.getWorld() == world
&& chunk.getX() == chunkX
&& chunk.getZ() == chunkZ;
}
public boolean isInLoadedChunk() {
return world.isChunkLoaded(chunkX, chunkZ);
}
public Location getLocation() {
return new Location(world, x, y, z);
}
protected void setLocation(Location location) {
setLocation(location.getWorld(), location.getX(), location.getY(), location.getZ());
}
protected void setLocation(World world, double x, double y, double z) {
Preconditions.notNull(world, "world");
this.world = world;
this.x = x;
this.y = y;
this.z = z;
this.chunkX = Utils.floor(x) >> 4;
this.chunkZ = Utils.floor(z) >> 4;
}
public World getWorld() {
return world;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getZ() {
return z;
}
}

View File

@ -1,37 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import org.bukkit.Location;
public class InternalHologram extends BaseHologram {
private final String name;
private final InternalHologramManager internalHologramManager;
protected InternalHologram(Location source, String name, NMSManager nmsManager, InternalHologramManager internalHologramManager) {
super(source, nmsManager);
this.name = name;
this.internalHologramManager = internalHologramManager;
setAllowPlaceholders(true);
}
public String getName() {
return name;
}
@Override
public void delete() {
internalHologramManager.deleteHologram(this);
}
@Override
public String toString() {
return "InternalHologram [name=" + name + ", super=" + super.toString() + "]";
}
}

View File

@ -0,0 +1,95 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.api;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.object.base.BaseHologramLine;
import me.filoghost.holographicdisplays.object.base.BaseItemLine;
import me.filoghost.holographicdisplays.object.base.BaseTextLine;
import org.bukkit.Location;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.List;
public class APIHologram extends BaseHologram implements Hologram {
private final Plugin plugin;
private final APIHologramManager apiHologramManager;
private final List<BaseHologramLine> lines;
protected APIHologram(Location source, Plugin plugin, NMSManager nmsManager, APIHologramManager apiHologramManager) {
super(source, nmsManager);
Preconditions.notNull(plugin, "plugin");
this.plugin = plugin;
this.apiHologramManager = apiHologramManager;
this.lines = new ArrayList<>();
}
public Plugin getOwner() {
return plugin;
}
@Override
public List<BaseHologramLine> getLinesUnsafe() {
return lines;
}
@Override
public TextLine appendTextLine(String text) {
checkState();
BaseTextLine line = new BaseTextLine(this, text);
lines.add(line);
refresh();
return line;
}
@Override
public ItemLine appendItemLine(ItemStack itemStack) {
checkState();
Preconditions.notNull(itemStack, "itemStack");
BaseItemLine line = new BaseItemLine(this, itemStack);
lines.add(line);
refresh();
return line;
}
@Override
public TextLine insertTextLine(int index, String text) {
checkState();
BaseTextLine line = new BaseTextLine(this, text);
lines.add(index, line);
refresh();
return line;
}
@Override
public ItemLine insertItemLine(int index, ItemStack itemStack) {
checkState();
Preconditions.notNull(itemStack, "itemStack");
BaseItemLine line = new BaseItemLine(this, itemStack);
lines.add(index, line);
refresh();
return line;
}
@Override
public void delete() {
apiHologramManager.deleteHologram(this);
}
}

View File

@ -3,18 +3,20 @@
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package me.filoghost.holographicdisplays.object; package me.filoghost.holographicdisplays.object.api;
import me.filoghost.holographicdisplays.api.Hologram; import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.base.BaseHologramManager;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.LinkedList;
import java.util.Set; import java.util.List;
public class APIHologramManager extends HologramManager<APIHologram> { public class APIHologramManager extends BaseHologramManager<APIHologram> {
private final NMSManager nmsManager; private final NMSManager nmsManager;
@ -28,8 +30,8 @@ public class APIHologramManager extends HologramManager<APIHologram> {
return hologram; return hologram;
} }
public Set<Hologram> getHologramsByPlugin(Plugin plugin) { public Collection<Hologram> getHologramsByPlugin(Plugin plugin) {
Set<Hologram> ownedHolograms = new HashSet<>(); List<Hologram> ownedHolograms = new LinkedList<>();
for (APIHologram hologram : getHolograms()) { for (APIHologram hologram : getHolograms()) {
if (hologram.getOwner().equals(plugin)) { if (hologram.getOwner().equals(plugin)) {
@ -37,7 +39,7 @@ public class APIHologramManager extends HologramManager<APIHologram> {
} }
} }
return Collections.unmodifiableSet(ownedHolograms); return Collections.unmodifiableList(ownedHolograms);
} }
} }

View File

@ -0,0 +1,207 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.base;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.api.VisibilityManager;
import me.filoghost.holographicdisplays.api.line.HologramLine;
import me.filoghost.holographicdisplays.disk.Configuration;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.HologramComponent;
import org.bukkit.Location;
import org.bukkit.World;
import java.util.List;
public abstract class BaseHologram extends HologramComponent implements Hologram {
private final NMSManager nmsManager;
private final VisibilityManager visibilityManager;
private final long creationTimestamp;
private boolean allowPlaceholders;
private boolean deleted;
public BaseHologram(Location location, NMSManager nmsManager) {
Preconditions.notNull(location, "location");
this.setLocation(location);
this.nmsManager = nmsManager;
this.visibilityManager = new DefaultVisibilityManager(this);
this.creationTimestamp = System.currentTimeMillis();
this.allowPlaceholders = false;
}
public abstract List<? extends SpawnableHologramLine> getLinesUnsafe();
@Override
public boolean isDeleted() {
return deleted;
}
public void setDeleted() {
if (!deleted) {
deleted = true;
clearLines();
}
}
@Override
public long getCreationTimestamp() {
return creationTimestamp;
}
@Override
public void setAllowPlaceholders(boolean allowPlaceholders) {
if (this.allowPlaceholders == allowPlaceholders) {
return;
}
this.allowPlaceholders = allowPlaceholders;
refresh(true);
}
@Override
public boolean isAllowPlaceholders() {
return allowPlaceholders;
}
public NMSManager getNMSManager() {
return nmsManager;
}
@Override
public HologramLine getLine(int index) {
return getLinesUnsafe().get(index);
}
@Override
public void removeLine(int index) {
checkState();
getLinesUnsafe().remove(index).despawn();
refresh();
}
public void removeLine(SpawnableHologramLine line) {
checkState();
getLinesUnsafe().remove(line);
line.despawn();
refresh();
}
@Override
public void clearLines() {
for (SpawnableHologramLine line : getLinesUnsafe()) {
line.despawn();
}
getLinesUnsafe().clear();
}
@Override
public int size() {
return getLinesUnsafe().size();
}
@Override
public void teleport(Location location) {
Preconditions.notNull(location, "location");
teleport(location.getWorld(), location.getX(), location.getY(), location.getZ());
}
@Override
public void teleport(World world, double x, double y, double z) {
checkState();
Preconditions.notNull(world, "world");
setLocation(world, x, y, z);
refresh();
}
public void refresh() {
refresh(false);
}
public void refresh(boolean forceRespawn) {
refresh(forceRespawn, isInLoadedChunk());
}
public void refresh(boolean forceRespawn, boolean isChunkLoaded) {
checkState();
if (isChunkLoaded) {
respawnEntities(forceRespawn);
} else {
despawnEntities();
}
}
@Override
public double getHeight() {
if (getLinesUnsafe().isEmpty()) {
return 0;
}
double height = 0.0;
for (SpawnableHologramLine line : getLinesUnsafe()) {
height += line.getHeight();
}
height += Configuration.spaceBetweenLines * (getLinesUnsafe().size() - 1);
return height;
}
/*
* When spawning at a location, the top part of the first line should be exactly on that location.
* The second line is below the first, and so on.
*/
private void respawnEntities(boolean forceRespawn) {
double currentLineY = getY();
for (int i = 0; i < getLinesUnsafe().size(); i++) {
SpawnableHologramLine line = getLinesUnsafe().get(i);
currentLineY -= line.getHeight();
if (i > 0) {
currentLineY -= Configuration.spaceBetweenLines;
}
if (forceRespawn) {
line.despawn();
}
line.respawn(getWorld(), getX(), currentLineY, getZ());
}
}
public void despawnEntities() {
for (SpawnableHologramLine line : getLinesUnsafe()) {
line.despawn();
}
}
@Override
public VisibilityManager getVisibilityManager() {
return visibilityManager;
}
protected void checkState() {
Preconditions.checkState(!deleted, "hologram already deleted");
}
@Override
public String toString() {
return "BaseHologram [location=" + getLocation() + ", lines=" + getLinesUnsafe() + ", deleted=" + deleted + "]";
}
/*
* Object.equals() and Object.hashCode() are not overridden:
* two holograms are equal only if they are the same exact instance.
*/
}

View File

@ -0,0 +1,77 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.base;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.HologramComponent;
import org.bukkit.World;
public abstract class BaseHologramLine extends HologramComponent implements SpawnableHologramLine {
private final BaseHologram parent;
private boolean isSpawned;
protected BaseHologramLine(BaseHologram parent) {
Preconditions.notNull(parent, "parent hologram");
this.parent = parent;
}
public final BaseHologram getParent() {
return parent;
}
protected final NMSManager getNMSManager() {
return parent.getNMSManager();
}
@Override
public final void removeLine() {
parent.removeLine(this);
}
@Override
public final void respawn(World world, double x, double y, double z) {
Preconditions.notNull(world, "world");
boolean changedWorld = world != getWorld();
setLocation(world, x, y, z);
if (changedWorld) {
// World has changed, entities must be fully respawned
despawnEntities();
spawnEntities(world, x, y, z);
} else if (isSpawned) {
// Line is already spawned, respawn can be avoided
teleportEntities(x, y, z);
} else {
// Line is not spawned, entities must be spawned
spawnEntities(world, x, y, z);
}
isSpawned = true;
}
@Override
public final void despawn() {
despawnEntities();
isSpawned = false;
}
protected boolean isSpawned() {
return isSpawned;
}
protected abstract void spawnEntities(World world, double x, double y, double z);
protected abstract void teleportEntities(double x, double y, double z);
protected abstract void despawnEntities();
}

View File

@ -3,7 +3,7 @@
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package me.filoghost.holographicdisplays.object; package me.filoghost.holographicdisplays.object.base;
import me.filoghost.fcommons.Preconditions; import me.filoghost.fcommons.Preconditions;
import org.bukkit.Chunk; import org.bukkit.Chunk;
@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
public class HologramManager<H extends BaseHologram> { public class BaseHologramManager<H extends BaseHologram> {
private final List<H> holograms = new ArrayList<>(); private final List<H> holograms = new ArrayList<>();
private final List<H> unmodifiableHologramsView = Collections.unmodifiableList(holograms); private final List<H> unmodifiableHologramsView = Collections.unmodifiableList(holograms);
@ -21,7 +21,7 @@ public class HologramManager<H extends BaseHologram> {
holograms.add(hologram); holograms.add(hologram);
} }
protected void deleteHologram(H hologram) { public void deleteHologram(H hologram) {
Preconditions.checkArgument(hologram.isDeleted(), "hologram must be deleted first"); Preconditions.checkArgument(hologram.isDeleted(), "hologram must be deleted first");
holograms.remove(hologram); holograms.remove(hologram);
hologram.setDeleted(); hologram.setDeleted();
@ -36,7 +36,7 @@ public class HologramManager<H extends BaseHologram> {
holograms.clear(); holograms.clear();
for (H hologram : oldHolograms) { for (H hologram : oldHolograms) {
hologram.delete(); hologram.setDeleted();
} }
} }
@ -44,7 +44,7 @@ public class HologramManager<H extends BaseHologram> {
// Load the holograms in that chunk. // Load the holograms in that chunk.
for (H hologram : holograms) { for (H hologram : holograms) {
if (hologram.isInChunk(chunk)) { if (hologram.isInChunk(chunk)) {
hologram.spawnEntities(); hologram.refresh(false, true);
} }
} }
} }

View File

@ -0,0 +1,130 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.base;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.handler.PickupHandler;
import me.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import org.bukkit.World;
import org.bukkit.inventory.ItemStack;
import java.util.Collection;
public class BaseItemLine extends BaseTouchableLine implements ItemLine {
private ItemStack itemStack;
private PickupHandler pickupHandler;
private NMSItem itemEntity;
private NMSArmorStand vehicleEntity;
public BaseItemLine(BaseHologram parent, ItemStack itemStack) {
super(parent);
setItemStack(itemStack);
}
@Override
public ItemStack getItemStack() {
return itemStack;
}
@Override
public void setItemStack(ItemStack itemStack) {
Preconditions.notNull(itemStack, "itemStack");
Preconditions.checkArgument(0 < itemStack.getAmount() && itemStack.getAmount() <= 64, "Item must have amount between 1 and 64");
this.itemStack = itemStack;
if (itemEntity != null) {
itemEntity.setItemStackNMS(itemStack);
}
}
@Override
public PickupHandler getPickupHandler() {
return pickupHandler;
}
@Override
public void setPickupHandler(PickupHandler pickupHandler) {
this.pickupHandler = pickupHandler;
}
@Override
public void spawnEntities(World world, double x, double y, double z) {
super.spawnEntities(world, x, y, z);
if (itemStack != null) {
itemEntity = getNMSManager().spawnNMSItem(world, x, y + getItemSpawnOffset(), z, this, itemStack);
vehicleEntity = getNMSManager().spawnNMSArmorStand(world, x, y + getItemSpawnOffset(), z, this);
itemEntity.setPassengerOfNMS(vehicleEntity);
}
}
@Override
public void teleportEntities(double x, double y, double z) {
super.teleportEntities(x, y, z);
if (vehicleEntity != null) {
vehicleEntity.setLocationNMS(x, y + getItemSpawnOffset(), z);
}
if (itemEntity != null) {
itemEntity.setLocationNMS(x, y + getItemSpawnOffset(), z);
}
}
@Override
public void despawnEntities() {
super.despawnEntities();
if (vehicleEntity != null) {
vehicleEntity.killEntityNMS();
vehicleEntity = null;
}
if (itemEntity != null) {
itemEntity.killEntityNMS();
itemEntity = null;
}
}
@Override
public double getHeight() {
return 0.7;
}
@Override
public void collectEntityIDs(Collection<Integer> collector) {
super.collectEntityIDs(collector);
if (vehicleEntity != null) {
collector.add(vehicleEntity.getIdNMS());
}
if (itemEntity != null) {
collector.add(itemEntity.getIdNMS());
}
}
public NMSItem getNMSItem() {
return itemEntity;
}
public NMSArmorStand getNMSVehicle() {
return vehicleEntity;
}
private double getItemSpawnOffset() {
return 0;
}
@Override
public String toString() {
return "ItemLine [itemStack=" + itemStack + ", pickupHandler=" + pickupHandler + "]";
}
}

View File

@ -3,52 +3,45 @@
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package me.filoghost.holographicdisplays.object.line; package me.filoghost.holographicdisplays.object.base;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.api.line.TextLine; import me.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSNameable;
import me.filoghost.holographicdisplays.object.BaseHologram;
import me.filoghost.holographicdisplays.placeholder.PlaceholdersManager; import me.filoghost.holographicdisplays.placeholder.PlaceholdersManager;
import me.filoghost.holographicdisplays.placeholder.RelativePlaceholder; import me.filoghost.holographicdisplays.placeholder.RelativePlaceholder;
import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
public class TextLineImpl extends TouchableLineImpl implements TextLine { public class BaseTextLine extends BaseTouchableLine implements TextLine {
private String text; private String text;
private List<RelativePlaceholder> relativePlaceholders; private List<RelativePlaceholder> relativePlaceholders;
private NMSArmorStand nmsNameable; private NMSArmorStand nameableEntity;
public TextLineImpl(BaseHologram parent, String text) { public BaseTextLine(BaseHologram parent, String text) {
super(parent); super(parent);
setText(text); setText(text);
} }
@Override
public String getText() { public String getText() {
return text; return text;
} }
@Override
public void setText(String text) { public void setText(String text) {
this.text = text; this.text = text;
if (nmsNameable != null) { if (nameableEntity != null) {
if (text != null && !text.isEmpty()) { if (text != null && !text.isEmpty()) {
nmsNameable.setCustomNameNMS(text); nameableEntity.setCustomNameNMS(text);
if (getParent().isAllowPlaceholders()) { if (getParent().isAllowPlaceholders()) {
PlaceholdersManager.trackIfNecessary(this); PlaceholdersManager.trackIfNecessary(this);
} }
} else { } else {
nmsNameable.setCustomNameNMS(""); // It will not appear nameableEntity.setCustomNameNMS(""); // It will not appear
if (getParent().isAllowPlaceholders()) { if (getParent().isAllowPlaceholders()) {
PlaceholdersManager.untrack(this); PlaceholdersManager.untrack(this);
} }
@ -73,34 +66,36 @@ public class TextLineImpl extends TouchableLineImpl implements TextLine {
} }
@Override @Override
public void setTouchHandler(TouchHandler touchHandler) { public void spawnEntities(World world, double x, double y, double z) {
if (nmsNameable != null) { super.spawnEntities(world, x, y, z);
Location loc = nmsNameable.getBukkitEntityNMS().getLocation();
super.setTouchHandler(touchHandler, loc.getWorld(), loc.getX(), loc.getY() - getTextOffset(), loc.getZ()); nameableEntity = getNMSManager().spawnNMSArmorStand(world, x, y + getTextSpawnOffset(), z, this);
} else {
super.setTouchHandler(touchHandler, null, 0, 0, 0); if (text != null && !text.isEmpty()) {
nameableEntity.setCustomNameNMS(text);
}
if (getParent().isAllowPlaceholders()) {
PlaceholdersManager.trackIfNecessary(this);
} }
} }
@Override @Override
public void spawnEntities(World world, double x, double y, double z) { public void teleportEntities(double x, double y, double z) {
super.spawnEntities(world, x, y, z); super.teleportEntities(x, y, z);
nmsNameable = getNMSManager().spawnNMSArmorStand(world, x, y + getTextOffset(), z, this); if (nameableEntity != null) {
nameableEntity.setLocationNMS(x, y + getTextSpawnOffset(), z);
if (text != null && !text.isEmpty()) {
nmsNameable.setCustomNameNMS(text);
} }
} }
@Override @Override
public void despawnEntities() { public void despawnEntities() {
super.despawnEntities(); super.despawnEntities();
if (nmsNameable != null) { if (nameableEntity != null) {
nmsNameable.killEntityNMS(); nameableEntity.killEntityNMS();
nmsNameable = null; nameableEntity = null;
} }
} }
@ -118,33 +113,20 @@ public class TextLineImpl extends TouchableLineImpl implements TextLine {
} }
@Override @Override
public void teleport(double x, double y, double z) { public void collectEntityIDs(Collection<Integer> collector) {
super.teleport(x, y, z); super.collectEntityIDs(collector);
if (nmsNameable != null) { if (nameableEntity != null) {
nmsNameable.setLocationNMS(x, y + getTextOffset(), z); collector.add(nameableEntity.getIdNMS());
} }
} }
@Override public NMSArmorStand getNMSNameable() {
public int[] getEntitiesIDs() { return nameableEntity;
if (isSpawned()) {
if (touchSlime != null) {
return ArrayUtils.add(touchSlime.getEntitiesIDs(), nmsNameable.getIdNMS());
} else {
return new int[] {nmsNameable.getIdNMS()};
}
} else {
return new int[0];
}
} }
public NMSNameable getNmsNameable() { private double getTextSpawnOffset() {
return nmsNameable; return -0.29;
}
private double getTextOffset() {
return Offsets.ARMOR_STAND_ALONE;
} }
@Override @Override

View File

@ -0,0 +1,123 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.base;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.api.line.TouchableLine;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import org.bukkit.World;
import java.util.Collection;
/**
* Useful class that implements TouchablePiece. The downside is that subclasses must extend this, and cannot extend other classes.
* But all the current items are touchable.
*/
public abstract class BaseTouchableLine extends BaseHologramLine implements TouchableLine {
private static final double SLIME_HEIGHT = 0.5;
private TouchHandler touchHandler;
private NMSSlime slimeEntity;
private NMSArmorStand vehicleEntity;
protected BaseTouchableLine(BaseHologram parent) {
super(parent);
}
@Override
public void setTouchHandler(TouchHandler touchHandler) {
this.touchHandler = touchHandler;
if (touchHandler != null && slimeEntity == null && super.isSpawned()) {
// If the touch handler was null before and no entity has been spawned, spawn it now.
spawnSlime(getWorld(), getX(), getY(), getZ());
} else if (touchHandler == null) {
// Opposite case, the touch handler was not null and an entity was spawned, but now it's useless.
despawnSlime();
}
}
@Override
public TouchHandler getTouchHandler() {
return this.touchHandler;
}
@Override
public void spawnEntities(World world, double x, double y, double z) {
if (touchHandler != null) {
spawnSlime(world, x, y, z);
}
}
@Override
public void teleportEntities(double x, double y, double z) {
if (vehicleEntity != null) {
vehicleEntity.setLocationNMS(x, getSlimeSpawnY(y), z);
}
if (slimeEntity != null) {
slimeEntity.setLocationNMS(x, getSlimeSpawnY(y), z);
}
}
@Override
public void despawnEntities() {
despawnSlime();
}
private void spawnSlime(World world, double x, double y, double z) {
despawnSlime();
if (world != null) {
slimeEntity = getNMSManager().spawnNMSSlime(world, x, getSlimeSpawnY(y), z, this);
vehicleEntity = getNMSManager().spawnNMSArmorStand(world, x, getSlimeSpawnY(y), z, this);
slimeEntity.setPassengerOfNMS(vehicleEntity);
}
}
private void despawnSlime() {
if (slimeEntity != null) {
slimeEntity.killEntityNMS();
slimeEntity = null;
}
if (vehicleEntity != null) {
vehicleEntity.killEntityNMS();
vehicleEntity = null;
}
}
private double getSlimeSpawnY(double y) {
return y + ((getHeight() - SLIME_HEIGHT) / 2) + getSlimeSpawnOffset();
}
private double getSlimeSpawnOffset() {
return 0;
}
@Override
public void collectEntityIDs(Collection<Integer> collector) {
if (vehicleEntity != null) {
collector.add(vehicleEntity.getIdNMS());
}
if (slimeEntity != null) {
collector.add(slimeEntity.getIdNMS());
}
}
public NMSArmorStand getNMSVehicle() {
return vehicleEntity;
}
public NMSSlime getNMSSlime() {
return slimeEntity;
}
}

View File

@ -3,10 +3,9 @@
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package me.filoghost.holographicdisplays.object; package me.filoghost.holographicdisplays.object.base;
import me.filoghost.fcommons.Preconditions; import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.api.VisibilityManager; import me.filoghost.holographicdisplays.api.VisibilityManager;
import me.filoghost.holographicdisplays.bridge.protocollib.ProtocolLibHook; import me.filoghost.holographicdisplays.bridge.protocollib.ProtocolLibHook;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -17,15 +16,15 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class VisibilityManagerImpl implements VisibilityManager { public class DefaultVisibilityManager implements VisibilityManager {
private static final int VISIBILITY_DISTANCE_SQUARED = 64 * 64;
private final BaseHologram hologram; private final BaseHologram hologram;
private Map<String, Boolean> playersVisibilityMap; private Map<String, Boolean> playersVisibilityMap;
private boolean visibleByDefault; private boolean visibleByDefault;
private static final int VISIBILITY_DISTANCE_SQUARED = 64 * 64; public DefaultVisibilityManager(BaseHologram hologram) {
public VisibilityManagerImpl(BaseHologram hologram) {
Preconditions.notNull(hologram, "hologram"); Preconditions.notNull(hologram, "hologram");
this.hologram = hologram; this.hologram = hologram;
this.visibleByDefault = true; this.visibleByDefault = true;
@ -161,7 +160,7 @@ public class VisibilityManagerImpl implements VisibilityManager {
} }
} }
private boolean isNear(Player player, Hologram hologram) { private boolean isNear(Player player, BaseHologram hologram) {
return player.isOnline() return player.isOnline()
&& player.getWorld().equals(hologram.getWorld()) && player.getWorld().equals(hologram.getWorld())
&& player.getLocation().distanceSquared(hologram.getLocation()) < VISIBILITY_DISTANCE_SQUARED; && player.getLocation().distanceSquared(hologram.getLocation()) < VISIBILITY_DISTANCE_SQUARED;

View File

@ -0,0 +1,23 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.base;
import me.filoghost.holographicdisplays.api.line.HologramLine;
import org.bukkit.World;
import java.util.Collection;
public interface SpawnableHologramLine extends HologramLine {
void respawn(World world, double x, double y, double z);
void despawn();
double getHeight();
void collectEntityIDs(Collection<Integer> collector);
}

View File

@ -0,0 +1,69 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.internal;
import me.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.base.BaseHologram;
import org.bukkit.Location;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
public class InternalHologram extends BaseHologram {
private final String name;
private final List<InternalHologramLine> lines;
protected InternalHologram(Location source, String name, NMSManager nmsManager) {
super(source, nmsManager);
super.setAllowPlaceholders(true);
this.name = name;
this.lines = new ArrayList<>();
}
public String getName() {
return name;
}
@Override
public List<InternalHologramLine> getLinesUnsafe() {
return lines;
}
@Override
public String toString() {
return "InternalHologram [name=" + name + ", super=" + super.toString() + "]";
}
@Override
public TextLine appendTextLine(String text) {
throw new UnsupportedOperationException();
}
@Override
public ItemLine appendItemLine(ItemStack itemStack) {
throw new UnsupportedOperationException();
}
@Override
public TextLine insertTextLine(int index, String text) {
throw new UnsupportedOperationException();
}
@Override
public ItemLine insertItemLine(int index, ItemStack itemStack) {
throw new UnsupportedOperationException();
}
@Override
public void delete() {
throw new UnsupportedOperationException();
}
}

View File

@ -0,0 +1,14 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.internal;
import me.filoghost.holographicdisplays.object.base.SpawnableHologramLine;
public interface InternalHologramLine extends SpawnableHologramLine {
String getSerializedConfigValue();
}

View File

@ -3,12 +3,13 @@
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package me.filoghost.holographicdisplays.object; package me.filoghost.holographicdisplays.object.internal;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager; import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.base.BaseHologramManager;
import org.bukkit.Location; import org.bukkit.Location;
public class InternalHologramManager extends HologramManager<InternalHologram> { public class InternalHologramManager extends BaseHologramManager<InternalHologram> {
private final NMSManager nmsManager; private final NMSManager nmsManager;
@ -17,7 +18,7 @@ public class InternalHologramManager extends HologramManager<InternalHologram> {
} }
public InternalHologram createHologram(Location source, String name) { public InternalHologram createHologram(Location source, String name) {
InternalHologram hologram = new InternalHologram(source, name, nmsManager, this); InternalHologram hologram = new InternalHologram(source, name, nmsManager);
super.addHologram(hologram); super.addHologram(hologram);
return hologram; return hologram;
} }

View File

@ -0,0 +1,25 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.internal;
import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.object.base.BaseItemLine;
import org.bukkit.inventory.ItemStack;
public class InternalItemLine extends BaseItemLine implements InternalHologramLine {
private final String serializedConfigValue;
public InternalItemLine(BaseHologram parent, ItemStack itemStack, String serializedConfigValue) {
super(parent, itemStack);
this.serializedConfigValue = serializedConfigValue;
}
public String getSerializedConfigValue() {
return serializedConfigValue;
}
}

View File

@ -0,0 +1,24 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.internal;
import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.object.base.BaseTextLine;
public class InternalTextLine extends BaseTextLine implements InternalHologramLine {
private final String serializedConfigValue;
public InternalTextLine(BaseHologram parent, String text, String serializedConfigValue) {
super(parent, text);
this.serializedConfigValue = serializedConfigValue;
}
public String getSerializedConfigValue() {
return serializedConfigValue;
}
}

View File

@ -1,80 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.line;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.line.HologramLine;
import me.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import me.filoghost.holographicdisplays.object.BaseHologram;
import org.bukkit.World;
public abstract class HologramLineImpl implements HologramLine {
private final BaseHologram parent;
// This field is necessary for teleport.
private boolean isSpawned;
// Useful for saving to disk.
private String serializedConfigValue;
protected HologramLineImpl(BaseHologram parent) {
Preconditions.notNull(parent, "parent hologram");
this.parent = parent;
}
@Override
public final BaseHologram getParent() {
return parent;
}
protected final NMSManager getNMSManager() {
return parent.getNMSManager();
}
@Override
public void removeLine() {
parent.removeLine(this);
}
public void spawn(World world, double x, double y, double z) {
Preconditions.notNull(world, "world");
// Remove the old entities when spawning the new ones.
despawn();
isSpawned = true;
spawnEntities(world, x, y, z);
}
public final void despawn() {
isSpawned = false;
despawnEntities();
}
public String getSerializedConfigValue() {
return serializedConfigValue;
}
public void setSerializedConfigValue(String serializedConfigValue) {
this.serializedConfigValue = serializedConfigValue;
}
public final boolean isSpawned() {
return isSpawned;
}
protected abstract void spawnEntities(World world, double x, double y, double z);
protected abstract void despawnEntities();
public abstract void teleport(double x, double y, double z);
public abstract double getHeight();
public abstract int[] getEntitiesIDs();
}

View File

@ -1,145 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.line;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.handler.PickupHandler;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import me.filoghost.holographicdisplays.object.BaseHologram;
import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.inventory.ItemStack;
public class ItemLineImpl extends TouchableLineImpl implements ItemLine {
private ItemStack itemStack;
private PickupHandler pickupHandler;
private NMSItem nmsItem;
private NMSArmorStand nmsVehicle;
public ItemLineImpl(BaseHologram parent, ItemStack itemStack) {
super(parent);
setItemStack(itemStack);
}
@Override
public ItemStack getItemStack() {
return itemStack;
}
@Override
public void setItemStack(ItemStack itemStack) {
Preconditions.notNull(itemStack, "itemStack");
Preconditions.checkArgument(0 < itemStack.getAmount() && itemStack.getAmount() <= 64, "Item must have amount between 1 and 64");
this.itemStack = itemStack;
if (nmsItem != null) {
nmsItem.setItemStackNMS(itemStack);
}
}
@Override
public PickupHandler getPickupHandler() {
return pickupHandler;
}
@Override
public void setPickupHandler(PickupHandler pickupHandler) {
this.pickupHandler = pickupHandler;
}
@Override
public void setTouchHandler(TouchHandler touchHandler) {
if (nmsVehicle != null) {
Location loc = nmsVehicle.getBukkitEntityNMS().getLocation();
super.setTouchHandler(touchHandler, loc.getWorld(), loc.getX(), loc.getY() - getItemOffset(), loc.getZ());
} else {
super.setTouchHandler(touchHandler, null, 0, 0, 0);
}
}
@Override
public void spawnEntities(World world, double x, double y, double z) {
super.spawnEntities(world, x, y, z);
if (itemStack != null) {
nmsItem = getNMSManager().spawnNMSItem(world, x, y + getItemOffset(), z, this, itemStack);
nmsVehicle = getNMSManager().spawnNMSArmorStand(world, x, y + getItemOffset(), z, this);
nmsItem.setPassengerOfNMS(nmsVehicle);
}
}
@Override
public void despawnEntities() {
super.despawnEntities();
if (nmsVehicle != null) {
nmsVehicle.killEntityNMS();
nmsVehicle = null;
}
if (nmsItem != null) {
nmsItem.killEntityNMS();
nmsItem = null;
}
}
@Override
public double getHeight() {
return 0.7;
}
@Override
public void teleport(double x, double y, double z) {
super.teleport(x, y, z);
if (nmsVehicle != null) {
nmsVehicle.setLocationNMS(x, y + getItemOffset(), z);
}
if (nmsItem != null) {
nmsItem.setLocationNMS(x, y + getItemOffset(), z);
}
}
@Override
public int[] getEntitiesIDs() {
if (isSpawned()) {
if (touchSlime != null) {
return ArrayUtils.addAll(new int[] {nmsVehicle.getIdNMS(), nmsItem.getIdNMS()}, touchSlime.getEntitiesIDs());
} else {
return new int[] {nmsVehicle.getIdNMS(), nmsItem.getIdNMS()};
}
} else {
return new int[0];
}
}
public NMSItem getNmsItem() {
return nmsItem;
}
public NMSEntityBase getNmsVehicle() {
return nmsVehicle;
}
private double getItemOffset() {
return Offsets.ARMOR_STAND_WITH_ITEM;
}
@Override
public String toString() {
return "ItemLine [itemStack=" + itemStack + ", pickupHandler=" + pickupHandler + "]";
}
}

View File

@ -1,23 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.line;
/**
* When spawning a hologram at a location, the top part of the first line should be exactly on that location.
* The second line is below the first, and so on.
*/
public class Offsets {
// A single armor stand.
public static final double ARMOR_STAND_ALONE = -0.29;
// An armor stand holding an item.
public static final double ARMOR_STAND_WITH_ITEM = 0;
// An armor stand holding a slime.
public static final double ARMOR_STAND_WITH_SLIME = 0;
}

View File

@ -1,99 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.line;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import me.filoghost.holographicdisplays.object.BaseHologram;
import org.bukkit.World;
/**
* A touch slime that can be applied to a line.
*/
public class TouchSlimeLineImpl extends HologramLineImpl {
// The touchable piece associated with this piece
private final TouchableLineImpl touchablePiece;
private NMSSlime nmsSlime;
private NMSArmorStand nmsVehicle;
protected TouchSlimeLineImpl(BaseHologram parent, TouchableLineImpl touchablePiece) {
super(parent);
this.touchablePiece = touchablePiece;
}
public TouchableLineImpl getTouchablePiece() {
return touchablePiece;
}
@Override
public void spawnEntities(World world, double x, double y, double z) {
nmsSlime = getNMSManager().spawnNMSSlime(world, x, y + getSlimeOffset(), z, this);
nmsVehicle = getNMSManager().spawnNMSArmorStand(world, x, y + getSlimeOffset(), z, this);
nmsSlime.setPassengerOfNMS(nmsVehicle);
}
@Override
public void despawnEntities() {
if (nmsSlime != null) {
nmsSlime.killEntityNMS();
nmsSlime = null;
}
if (nmsVehicle != null) {
nmsVehicle.killEntityNMS();
nmsVehicle = null;
}
}
@Override
public double getHeight() {
return 0.5;
}
@Override
public void teleport(double x, double y, double z) {
if (nmsVehicle != null) {
nmsVehicle.setLocationNMS(x, y + getSlimeOffset(), z);
}
if (nmsSlime != null) {
nmsSlime.setLocationNMS(x, y + getSlimeOffset(), z);
}
}
@Override
public int[] getEntitiesIDs() {
if (isSpawned()) {
return new int[] {nmsVehicle.getIdNMS(), nmsSlime.getIdNMS()};
} else {
return new int[0];
}
}
public NMSSlime getNmsSlime() {
return nmsSlime;
}
public NMSEntityBase getNmsVehicle() {
return nmsVehicle;
}
private double getSlimeOffset() {
return Offsets.ARMOR_STAND_WITH_SLIME;
}
@Override
public String toString() {
return "TouchSlimeLine [touchablePiece=" + touchablePiece + "]";
}
}

View File

@ -1,78 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.line;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.object.BaseHologram;
import org.bukkit.World;
/**
* Useful class that implements TouchablePiece. The downside is that subclasses must extend this, and cannot extend other classes.
* But all the current items are touchable.
*/
public abstract class TouchableLineImpl extends HologramLineImpl {
protected TouchSlimeLineImpl touchSlime;
private TouchHandler touchHandler;
protected TouchableLineImpl(BaseHologram parent) {
super(parent);
}
protected void setTouchHandler(TouchHandler touchHandler, World world, double x, double y, double z) {
this.touchHandler = touchHandler;
if (touchHandler != null && touchSlime == null && world != null) {
// If the touch handler was null before and no entity has been spawned, spawn it now.
touchSlime = new TouchSlimeLineImpl(getParent(), this);
touchSlime.spawn(world, x, y + (getHeight() / 2.0 - touchSlime.getHeight() / 2.0), z);
} else if (touchHandler == null && touchSlime != null) {
// Opposite case, the touch handler was not null and an entity was spawned, but now it's useless.
touchSlime.despawn();
touchSlime = null;
}
}
public TouchHandler getTouchHandler() {
return this.touchHandler;
}
@Override
public void spawnEntities(World world, double x, double y, double z) {
if (touchHandler != null) {
touchSlime = new TouchSlimeLineImpl(getParent(), this);
touchSlime.spawn(world, x, y + (getHeight() / 2.0 - touchSlime.getHeight() / 2.0), z);
}
}
@Override
public void despawnEntities() {
if (touchSlime != null) {
touchSlime.despawn();
touchSlime = null;
}
}
@Override
public void teleport(double x, double y, double z) {
if (touchSlime != null) {
touchSlime.teleport(x, y + (getHeight() / 2.0 - touchSlime.getHeight() / 2.0), z);
}
}
public TouchSlimeLineImpl getTouchSlime() {
return touchSlime;
}
}

View File

@ -10,7 +10,7 @@ import me.filoghost.holographicdisplays.api.placeholder.PlaceholderReplacer;
import me.filoghost.holographicdisplays.bridge.bungeecord.BungeeServerTracker; import me.filoghost.holographicdisplays.bridge.bungeecord.BungeeServerTracker;
import me.filoghost.holographicdisplays.common.Utils; import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSNameable; import me.filoghost.holographicdisplays.nms.interfaces.entity.NMSNameable;
import me.filoghost.holographicdisplays.object.line.TextLineImpl; import me.filoghost.holographicdisplays.object.base.BaseTextLine;
import me.filoghost.holographicdisplays.task.WorldPlayerCounterTask; import me.filoghost.holographicdisplays.task.WorldPlayerCounterTask;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
@ -88,33 +88,29 @@ public class PlaceholdersManager {
linesToUpdate.clear(); linesToUpdate.clear();
} }
public static void untrack(TextLineImpl line) { public static void untrack(BaseTextLine line) {
if (line == null || !line.isSpawned()) {
return;
}
Iterator<DynamicLineData> iter = linesToUpdate.iterator(); Iterator<DynamicLineData> iter = linesToUpdate.iterator();
while (iter.hasNext()) { while (iter.hasNext()) {
DynamicLineData data = iter.next(); DynamicLineData data = iter.next();
if (data.getEntity() == line.getNmsNameable()) { if (data.getEntity() == line.getNMSNameable()) {
iter.remove(); iter.remove();
data.getEntity().setCustomNameNMS(data.getOriginalName()); data.getEntity().setCustomNameNMS(data.getOriginalName());
} }
} }
} }
public static void trackIfNecessary(TextLineImpl line) { public static void trackIfNecessary(BaseTextLine line) {
NMSNameable nameableEntity = line.getNmsNameable(); String text = line.getText();
if (text == null || text.isEmpty()) {
return;
}
NMSNameable nameableEntity = line.getNMSNameable();
if (nameableEntity == null) { if (nameableEntity == null) {
return; return;
} }
String name = line.getText(); boolean updateText = false;
if (name == null || name.isEmpty()) {
return;
}
boolean updateName = false;
// Lazy initialization. // Lazy initialization.
Set<Placeholder> normalPlaceholders = null; Set<Placeholder> normalPlaceholders = null;
@ -125,7 +121,7 @@ public class PlaceholdersManager {
Matcher matcher; Matcher matcher;
for (Placeholder placeholder : PlaceholdersRegister.getPlaceholders()) { for (Placeholder placeholder : PlaceholdersRegister.getPlaceholders()) {
if (name.contains(placeholder.getTextPlaceholder())) { if (text.contains(placeholder.getTextPlaceholder())) {
if (normalPlaceholders == null) { if (normalPlaceholders == null) {
normalPlaceholders = new HashSet<>(); normalPlaceholders = new HashSet<>();
} }
@ -135,7 +131,7 @@ public class PlaceholdersManager {
// Players in a world count pattern. // Players in a world count pattern.
matcher = WORLD_PATTERN.matcher(name); matcher = WORLD_PATTERN.matcher(text);
while (matcher.find()) { while (matcher.find()) {
if (worldsOnlinePlayersReplacers == null) { if (worldsOnlinePlayersReplacers == null) {
worldsOnlinePlayersReplacers = new HashMap<>(); worldsOnlinePlayersReplacers = new HashMap<>();
@ -164,7 +160,7 @@ public class PlaceholdersManager {
} }
// BungeeCord online pattern. // BungeeCord online pattern.
matcher = BUNGEE_ONLINE_PATTERN.matcher(name); matcher = BUNGEE_ONLINE_PATTERN.matcher(text);
while (matcher.find()) { while (matcher.find()) {
if (bungeeReplacers == null) { if (bungeeReplacers == null) {
bungeeReplacers = new HashMap<>(); bungeeReplacers = new HashMap<>();
@ -198,7 +194,7 @@ public class PlaceholdersManager {
} }
// BungeeCord max players pattern. // BungeeCord max players pattern.
matcher = BUNGEE_MAX_PATTERN.matcher(name); matcher = BUNGEE_MAX_PATTERN.matcher(text);
while (matcher.find()) { while (matcher.find()) {
if (bungeeReplacers == null) { if (bungeeReplacers == null) {
bungeeReplacers = new HashMap<>(); bungeeReplacers = new HashMap<>();
@ -214,7 +210,7 @@ public class PlaceholdersManager {
} }
// BungeeCord motd pattern. // BungeeCord motd pattern.
matcher = BUNGEE_MOTD_PATTERN.matcher(name); matcher = BUNGEE_MOTD_PATTERN.matcher(text);
while (matcher.find()) { while (matcher.find()) {
if (bungeeReplacers == null) { if (bungeeReplacers == null) {
bungeeReplacers = new HashMap<>(); bungeeReplacers = new HashMap<>();
@ -230,7 +226,7 @@ public class PlaceholdersManager {
} }
// BungeeCord motd (line 2) pattern. // BungeeCord motd (line 2) pattern.
matcher = BUNGEE_MOTD_2_PATTERN.matcher(name); matcher = BUNGEE_MOTD_2_PATTERN.matcher(text);
while (matcher.find()) { while (matcher.find()) {
if (bungeeReplacers == null) { if (bungeeReplacers == null) {
bungeeReplacers = new HashMap<>(); bungeeReplacers = new HashMap<>();
@ -246,7 +242,7 @@ public class PlaceholdersManager {
} }
// BungeeCord status pattern. // BungeeCord status pattern.
matcher = BUNGEE_STATUS_PATTERN.matcher(name); matcher = BUNGEE_STATUS_PATTERN.matcher(text);
while (matcher.find()) { while (matcher.find()) {
if (bungeeReplacers == null) { if (bungeeReplacers == null) {
bungeeReplacers = new HashMap<>(); bungeeReplacers = new HashMap<>();
@ -263,7 +259,7 @@ public class PlaceholdersManager {
// Animation pattern. // Animation pattern.
matcher = ANIMATION_PATTERN.matcher(name); matcher = ANIMATION_PATTERN.matcher(text);
while (matcher.find()) { while (matcher.find()) {
String fileName = extractArgumentFromPlaceholder(matcher); String fileName = extractArgumentFromPlaceholder(matcher);
Placeholder animation = AnimationsRegister.getAnimation(fileName); Placeholder animation = AnimationsRegister.getAnimation(fileName);
@ -277,13 +273,13 @@ public class PlaceholdersManager {
animationsPlaceholders.put(matcher.group(), animation); animationsPlaceholders.put(matcher.group(), animation);
} else { } else {
name = name.replace(matcher.group(), "[Animation not found: " + fileName + "]"); text = text.replace(matcher.group(), "[Animation not found: " + fileName + "]");
updateName = true; updateText = true;
} }
} }
if (Utils.isThereNonNull(normalPlaceholders, bungeeReplacers, worldsOnlinePlayersReplacers, animationsPlaceholders)) { if (Utils.isThereNonNull(normalPlaceholders, bungeeReplacers, worldsOnlinePlayersReplacers, animationsPlaceholders)) {
DynamicLineData lineData = new DynamicLineData(nameableEntity, name); DynamicLineData lineData = new DynamicLineData(nameableEntity, text);
if (normalPlaceholders != null) { if (normalPlaceholders != null) {
lineData.setPlaceholders(normalPlaceholders); lineData.setPlaceholders(normalPlaceholders);
@ -312,8 +308,8 @@ public class PlaceholdersManager {
} else { } else {
// The name needs to be updated anyways. // The name needs to be updated anyways.
if (updateName) { if (updateText) {
nameableEntity.setCustomNameNMS(name); nameableEntity.setCustomNameNMS(text);
} }
} }
} }

View File

@ -9,8 +9,8 @@ import me.filoghost.fcommons.logging.Log;
import me.filoghost.holographicdisplays.common.Utils; import me.filoghost.holographicdisplays.common.Utils;
import me.filoghost.holographicdisplays.disk.HologramConfig; import me.filoghost.holographicdisplays.disk.HologramConfig;
import me.filoghost.holographicdisplays.disk.HologramLoadException; import me.filoghost.holographicdisplays.disk.HologramLoadException;
import me.filoghost.holographicdisplays.object.InternalHologram; import me.filoghost.holographicdisplays.object.internal.InternalHologram;
import me.filoghost.holographicdisplays.object.InternalHologramManager; import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import java.util.Collection; import java.util.Collection;
@ -29,7 +29,7 @@ public class StartupLoadHologramsTask implements Runnable {
for (HologramConfig hologramConfig : hologramConfigsToLoad) { for (HologramConfig hologramConfig : hologramConfigsToLoad) {
try { try {
InternalHologram hologram = hologramConfig.createHologram(internalHologramManager); InternalHologram hologram = hologramConfig.createHologram(internalHologramManager);
hologram.refreshAll(); hologram.refresh();
} catch (HologramLoadException e) { } catch (HologramLoadException e) {
Log.warning(Utils.formatExceptionMessage(e)); Log.warning(Utils.formatExceptionMessage(e));
} catch (Exception e) { } catch (Exception e) {