diff --git a/README.md b/README.md index f7fd4f16..21facff4 100644 --- a/README.md +++ b/README.md @@ -142,4 +142,5 @@ You really need to call GameSabotageDeactivateEvent when it's done. ## Alte recomandari - decrease player tracking range +- command to kill invisible armor_stands (holograms) on your maps during setup session `/kill @e[type=armor_stand,nbt={Invisible:1b}]` diff --git a/stevesus-api/pom.xml b/stevesus-api/pom.xml index 062978a4..f0f25b7d 100644 --- a/stevesus-api/pom.xml +++ b/stevesus-api/pom.xml @@ -11,6 +11,13 @@ stevesus-api + + + jitpack.io + https://jitpack.io + + + @@ -40,13 +47,21 @@ 1.1-SNAPSHOT provided - + + + com.github.unldenis.holoeasy + holoeasy-core + 4.3.2 + + + - com.andrei1058.hologramapi - hologram-api - [1.0-SNAPSHOT,) + com.github.retrooper + packetevents-spigot + 2.7.0 provided + com.andrei1058.spigot.versionsupport diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/PlayerCorpse.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/PlayerCorpse.java index d0a8ecd8..273894dc 100644 --- a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/PlayerCorpse.java +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/PlayerCorpse.java @@ -1,6 +1,6 @@ package com.andrei1058.stevesus.api.arena; -import com.andrei1058.hologramapi.Hologram; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; import org.bukkit.Location; import org.jetbrains.annotations.Nullable; @@ -37,7 +37,7 @@ public interface PlayerCorpse { /** * Get hologram to hide/ show it when necessary. */ - @Nullable Hologram getHologram(); + @Nullable HologramI getHologram(); /** * Check if the given location is in corpse's range. diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/meeting/MeetingButton.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/meeting/MeetingButton.java index fd76c91a..2aa9c0bf 100644 --- a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/meeting/MeetingButton.java +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/meeting/MeetingButton.java @@ -1,24 +1,24 @@ package com.andrei1058.stevesus.api.arena.meeting; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.api.SteveSusAPI; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.team.Team; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.common.api.arena.GameState; import com.andrei1058.stevesus.common.gui.ItemUtil; import org.bukkit.Location; -import org.bukkit.Particle; import org.bukkit.World; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -28,16 +28,18 @@ public class MeetingButton { // use this to identify armor stand entity public static final String MEETING_BUTTON_META_DATA_KEY = "mbtnss"; - private final Hologram buttonHologram; + private @Nullable HologramI buttonHologram = null; private long lastUsage; - private final List particleLocations; + private List particleLocations = new ArrayList<>(); private int currentEntry = -1; private UUID lastRequester; public MeetingButton(Plugin plugin, Location location, Arena arena) { location.setX(location.getBlockX() + 0.5); location.setZ(location.getBlockZ() + 0.5); - ArmorStand buttonKeeper = location.getWorld().spawn(location.clone().subtract(0, 1.5, 0), ArmorStand.class); + ArmorStand buttonKeeper = location.getWorld().spawn( + location.clone().subtract(0, 1.5, 0), ArmorStand.class + ); buttonKeeper.setRemoveWhenFarAway(false); buttonKeeper.setVisible(false); buttonKeeper.setGravity(false); @@ -45,22 +47,31 @@ public MeetingButton(Plugin plugin, Location location, Arena arena) { buttonKeeper.setHelmet(meetingHead); buttonKeeper.setMetadata(MEETING_BUTTON_META_DATA_KEY, new FixedMetadataValue(plugin, arena.getGameId())); - buttonHologram = new Hologram(location.clone().add(0, 1.5, 0), 3); - HologramPage page = buttonHologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> SteveSusAPI.getInstance().getLocaleHandler().getMsg(s, Message.EMERGENCY_BUTTON_HOLO1))); - page.setLineContent(1, new LineTextContent(s -> arena.getMeetingStage() == MeetingStage.NO_MEETING ? SteveSusAPI.getInstance().getLocaleHandler().getMsg(s, Message.EMERGENCY_BUTTON_HOLO2) : " ")); - page.setLineContent(2, new LineTextContent(s -> { - if (arena.getMeetingStage() == MeetingStage.TALKING) { - return SteveSusAPI.getInstance().getLocaleHandler().getMsg(s, Message.EMERGENCY_BUTTON_STATUS_VOTING_STARTS_IN).replace("{time}", String.valueOf(arena.getCountdown())); - } else if (arena.getMeetingStage() == MeetingStage.VOTING) { - return SteveSusAPI.getInstance().getLocaleHandler().getMsg(s, Message.EMERGENCY_BUTTON_STATUS_VOTING_ENDS_IN).replace("{time}", String.valueOf(arena.getCountdown())); - } - return SteveSusAPI.getInstance().getLocaleHandler().getMsg(s, Message.EMERGENCY_BUTTON_STATUS_YOUR_MEETINGS_LEFT).replace("{amount}", String.valueOf(arena.getMeetingsLeft(s))); - })); + if (null != HologramManager.getInstance().getProvider()) { + buttonHologram = HologramManager.getInstance().getProvider().spawnHologram(location); + + var localeHandler = SteveSusAPI.getInstance().getLocaleHandler(); + buttonHologram.setPageContent(Arrays.asList( + receiver -> localeHandler.getMsg(receiver, Message.EMERGENCY_BUTTON_HOLO1), + receiver -> arena.getMeetingStage() == MeetingStage.NO_MEETING ? + localeHandler.getMsg(receiver, Message.EMERGENCY_BUTTON_HOLO2) : + " ", + receiver -> { + if (arena.getMeetingStage() == MeetingStage.TALKING) { + return localeHandler.getMsg(receiver, Message.EMERGENCY_BUTTON_STATUS_VOTING_STARTS_IN) + .replace("{time}", String.valueOf(arena.getCountdown())); + } else if (arena.getMeetingStage() == MeetingStage.VOTING) { + return localeHandler.getMsg(receiver, Message.EMERGENCY_BUTTON_STATUS_VOTING_ENDS_IN) + .replace("{time}", String.valueOf(arena.getCountdown())); + } + return localeHandler.getMsg(receiver, Message.EMERGENCY_BUTTON_STATUS_YOUR_MEETINGS_LEFT) + .replace("{amount}", String.valueOf(arena.getMeetingsLeft(receiver))); + } + )); + buttonHologram.hideToAll(); + } this.particleLocations = getCircle(location.clone().add(0, 0.3, 0), 0.6, 15); - buttonHologram.hide(); } /** @@ -77,8 +88,15 @@ public void refreshLines(Arena arena) { } } - public void onGameStart() { - buttonHologram.show(); + public void onGameStart(Arena arena) { + if (null != buttonHologram && null != arena) { + arena.getPlayers().forEach( + player -> buttonHologram.showToPlayer(player) + ); + arena.getSpectators().forEach( + spectator -> buttonHologram.showToPlayer(spectator) + ); + } } /** diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/securitycamera/SecurityMonitor.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/securitycamera/SecurityMonitor.java index 9f7b6df4..a3ed933c 100644 --- a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/securitycamera/SecurityMonitor.java +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/securitycamera/SecurityMonitor.java @@ -1,49 +1,57 @@ package com.andrei1058.stevesus.api.arena.securitycamera; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.HologramClickListener; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.api.SteveSusAPI; -import com.andrei1058.stevesus.api.arena.Arena; -import com.andrei1058.stevesus.api.arena.team.Team; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Message; import org.bukkit.Location; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; public class SecurityMonitor { - private static HologramClickListener clickListener; +// private static HologramClickListener clickListener; private final Location location; - private Hologram hologram; + private @Nullable HologramI hologram; public SecurityMonitor(Location location){ this.location = location; - this.hologram = new Hologram(location, 2); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(player -> SteveSusAPI.getInstance().getLocaleHandler().getMsg(player, Message.SECURITY_MONITOR_HOLOGRAM_LINE1))); - page.setLineContent(1, new LineTextContent(player -> SteveSusAPI.getInstance().getLocaleHandler().getMsg(player, Message.SECURITY_MONITOR_HOLOGRAM_LINE2))); - - if (clickListener == null){ - clickListener = (player, lineClickType) -> { - Arena arena = SteveSusAPI.getInstance().getArenaHandler().getArenaByPlayer(player); - if (arena == null) return; - if (arena.getCamHandler() == null) return; - if (arena.getCamHandler().getCams().isEmpty()) return; - if (arena.isSpectator(player)) return; - Team playerTeam = arena.getPlayerTeam(player); - if (playerTeam == null) return; - if (playerTeam.getIdentifier().endsWith("-ghost")) return; - arena.getCamHandler().startWatching(player, arena, arena.getCamHandler().getCams().get(0)); - }; + + var holoManager = HologramManager.getInstance().getProvider(); + + if (null != holoManager) { + this.hologram = holoManager.spawnHologram(location); + + var langManager = SteveSusAPI.getInstance().getLocaleHandler(); + this.hologram.setPageContent(Arrays.asList( + player -> langManager.getMsg(player, Message.SECURITY_MONITOR_HOLOGRAM_LINE1), + player -> langManager.getMsg(player, Message.SECURITY_MONITOR_HOLOGRAM_LINE2) + )); } - hologram.allowCollisions(true); - hologram.setClickListener(clickListener); + // fixme +// if (clickListener == null){ +// clickListener = (player, lineClickType) -> { +// Arena arena = SteveSusAPI.getInstance().getArenaHandler().getArenaByPlayer(player); +// if (arena == null) return; +// if (arena.getCamHandler() == null) return; +// if (arena.getCamHandler().getCams().isEmpty()) return; +// if (arena.isSpectator(player)) return; +// Team playerTeam = arena.getPlayerTeam(player); +// if (playerTeam == null) return; +// if (playerTeam.getIdentifier().endsWith("-ghost")) return; +// arena.getCamHandler().startWatching(player, arena, arena.getCamHandler().getCams().get(0)); +// }; +// } + + // fixme +// hologram.allowCollisions(true); +// hologram.setClickListener(clickListener); } - public Hologram getHologram() { + public @Nullable HologramI getHologram() { return hologram; } @@ -51,7 +59,7 @@ public Location getLocation() { return location; } - public void setHologram(Hologram hologram) { + public void setHologram(@Nullable HologramI hologram) { this.hologram = hologram; } } diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/vent/Vent.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/vent/Vent.java index c76fb5e5..5fc0bea0 100644 --- a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/vent/Vent.java +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/arena/vent/Vent.java @@ -1,15 +1,15 @@ package com.andrei1058.stevesus.api.arena.vent; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.api.SteveSusAPI; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.common.CommonManager; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.LinkedList; @@ -21,13 +21,12 @@ public class Vent { private final Location location; private final LinkedList connections = new LinkedList<>(); private ItemStack displayItem; - private final Hologram hologram; + private @Nullable HologramI hologram; /** * Create a vent. * * @param identifier unique id. - * @param block trap block on which players must shift to start venting. */ public Vent(@NotNull String identifier, @NotNull Location location, @NotNull ItemStack displayItem) { this.identifier = identifier; @@ -35,12 +34,15 @@ public Vent(@NotNull String identifier, @NotNull Location location, @NotNull Ite this.location.setX(location.getBlockX() + 0.5); this.location.setZ(location.getBlockZ() + 0.5); this.displayItem = CommonManager.getINSTANCE().getItemSupport().addTag(displayItem, "nextVent", identifier); - hologram = new Hologram(location.clone().add(0, 0.5, 0), 1); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> SteveSusAPI.getInstance().getLocaleHandler().getMsg(s, Message.VENT_HOLO))); - hologram.hide(); - hologram.allowCollisions(false); + + if (null == HologramManager.getInstance().getProvider()) { + var holoManager = HologramManager.getInstance().getProvider(); + hologram = holoManager.spawnHologram(location.clone().add(0, 0.5, 0)); + hologram.setPageContent(List.of( + receiver -> SteveSusAPI.getInstance().getLocaleHandler().getMsg(receiver, Message.VENT_HOLO) + )); + hologram.hideToAll(); + } } /** @@ -108,7 +110,7 @@ public boolean equals(Object o) { return vent.getIdentifier().equals(getIdentifier()); } - public Hologram getHologram() { + public @Nullable HologramI getHologram() { return hologram; } } diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramI.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramI.java new file mode 100644 index 00000000..8e77ac92 --- /dev/null +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramI.java @@ -0,0 +1,55 @@ +package com.andrei1058.stevesus.api.hook.hologram; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.function.Function; + +/** + * Hologram interface to make it work with any hologram dependency. + * Used as Wrapper. + */ +public interface HologramI { + + /** + * @param pageContent per player lines. + */ + void setPageContent(List> pageContent); + + /** + * Make hologram invisible to everyone. + */ + void hideToAll(); + + /** + * Refresh hologram for given player. + */ + + void refreshLines(Player player); + + void refreshForAll(); + + /** + * Toggle {@link #hideToAll()}. + */ + void unHide(); + + void showToPlayer(Player player); + void hideFromPlayer(Player player); + + /** + * Destroy hologram. + * Remove any trace of players and worlds etc. + */ + void remove(); + + boolean isHiddenFor(Player player); + + Location getLocation(); + + /** + * Remove any trace of the given player to avoid memory leaks. + */ + void destroyPlayer(Player player); +} diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramManager.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramManager.java new file mode 100644 index 00000000..42815255 --- /dev/null +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramManager.java @@ -0,0 +1,94 @@ +package com.andrei1058.stevesus.api.hook.hologram; + +import com.andrei1058.stevesus.api.SteveSusAPI; +import com.andrei1058.stevesus.api.arena.Arena; +import com.andrei1058.stevesus.api.hook.hologram.easyholo.EasyHoloAdapter; +import com.github.retrooper.packetevents.PacketEvents; +import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.holoeasy.HoloEasy; +import org.holoeasy.packet.PacketImpl; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Function; + +public class HologramManager { + + private static HologramManager instance = new HologramManager(); + private @Nullable HologramProvider provider; + + private HologramManager() {} + + public static HologramManager getInstance() { + return instance; + } + + public @Nullable HologramProvider getProvider() { + return provider; + } + + public void setProvider(@Nullable HologramProvider provider) { + this.provider = provider; + if (null == provider) { + return; + } + provider.onAdapterInit(SteveSusAPI.getInstance()); + } + + public void onLoad(Plugin plugin) { + var packetEvents = Bukkit.getPluginManager().getPlugin("packetevents"); + if (null != packetEvents) { + // maybe check if enabled and then register + PacketEvents.setAPI(SpigotPacketEventsBuilder.build(plugin)); + //On Bukkit, calling this here is essential, hence the name "load" + PacketEvents.getAPI().load(); + } + } + + public void onEnable(Plugin plugin) { + var packetEvents = Bukkit.getPluginManager().getPlugin("packetevents"); + if (null != packetEvents) { + //Initialize! + PacketEvents.getAPI().init(); + + // ** Bind the library + HoloEasy.bind(plugin, PacketImpl.PacketEvents); + setProvider(new EasyHoloAdapter()); + } + } + + public void onDisable(Plugin plugin) { + var packetEvents = Bukkit.getPluginManager().getPlugin("packetevents"); + if (null != packetEvents) { + //Terminate the instance (clean up process) + PacketEvents.getAPI().terminate(); + } + } + + public @Nullable HologramI makeUnsafe(Location location, List> list) { + if (null == getProvider()) { + return null; + } + var holo = getProvider().spawnHologram(location); + holo.setPageContent(list); + return holo; + } + + public void onArenaLeave(Arena arena, Player player) { + if (null == getProvider()) { + return; + } + getProvider().onArenaLeave(arena, player); + } + + public void onArenaDestroy(Arena arena) { + if (null == getProvider()) { + return; + } + getProvider().onArenaDestroy(arena); + } +} diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramProvider.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramProvider.java new file mode 100644 index 00000000..b7c69138 --- /dev/null +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/HologramProvider.java @@ -0,0 +1,24 @@ +package com.andrei1058.stevesus.api.hook.hologram; + +import com.andrei1058.stevesus.api.arena.Arena; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public interface HologramProvider { + HologramI spawnHologram(Location location); + + /** + * Clean up player traces. + * Usually used to remove current player from hashmaps etc. + * + * @param arena game session. + * @param player subject. + */ + + void onArenaLeave(Arena arena, Player player); + + void onAdapterInit(Plugin plugin); + + void onArenaDestroy(Arena arena); +} diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/EasyHolo.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/EasyHolo.java new file mode 100644 index 00000000..21e1c414 --- /dev/null +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/EasyHolo.java @@ -0,0 +1,138 @@ +package com.andrei1058.stevesus.api.hook.hologram.easyholo; + +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.holoeasy.line.TextLine; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; +import java.util.function.Function; + +public class EasyHolo implements HologramI { + + private HashMap perPlayer = new HashMap<>(); + private Location location; + private List> pageContent = new ArrayList<>(); + + public EasyHolo(@NotNull Location location) { + this.location = location; + } + + @Override + public void setPageContent(List> pageContent) { + this.pageContent = pageContent; + if (!perPlayer.isEmpty()) { + perPlayer.forEach((uuid, holo) -> { + var player = Bukkit.getPlayer(uuid); + if (player != null) { + updateLines(player, holo); + } + }); + } + } + + @Override + public void hideToAll() { + perPlayer.forEach((uuid, holo) -> { + holo.hide(); + }); + } + + @Override + public void refreshLines(@NotNull Player player) { + var playerHolo = perPlayer.get(player.getUniqueId()); + + if (null == playerHolo) { + return; + } + + updateLines(player, playerHolo); + } + + @Override + public void refreshForAll() { + for (var perPlayer : perPlayer.values()) { + perPlayer.getPvt().getSeeingPlayers().forEach(pvt -> { + updateLines(pvt, perPlayer); + }); + } + } + + @Override + public void unHide() { + for (var entry : perPlayer.entrySet()) { + var player = Bukkit.getPlayer(entry.getKey()); + if (null == player) { + perPlayer.remove(entry.getKey()); + } else { + entry.getValue().show(player); + } + } + } + + @Override + public void showToPlayer(@NotNull Player player) { + var playerHolo = perPlayer.get(player.getUniqueId()); + if (playerHolo == null) { + playerHolo = createForPlayer(player); + } + playerHolo.show(player); + } + + private @NotNull PerPlayer createForPlayer(@NotNull Player player) { + var holo = new PerPlayer(this.location); + updateLines(player, holo); + perPlayer.put(player.getUniqueId(), holo); + return holo; + } + + private void updateLines(@NotNull Player player, @NotNull PerPlayer hologram) { + hologram.getLines().clear(); + this.pageContent.forEach(function -> { + hologram.getLines().add(new TextLine(hologram, function.apply(player), null, false)); + }); + } + + @Override + public void hideFromPlayer(@NotNull Player player) { + var playerHolo = perPlayer.get(player.getUniqueId()); + if (playerHolo == null) { + return; + } + playerHolo.hide(player); + perPlayer.remove(player.getUniqueId()); + } + + @Override + public void remove() { + perPlayer.values().forEach(holo -> { + holo.getPvt().getSeeingPlayers().forEach(holo::hide); + holo.getLines().clear(); + holo.getLocation().setWorld(null); + }); + perPlayer.clear(); + } + + @Override + public boolean isHiddenFor(@NotNull Player player) { + var holo = perPlayer.get(player.getUniqueId()); + if (null == holo) { + return true; + } + return !holo.isShownFor(player); + } + + public Location getLocation() { + return location; + } + + @Override + public void destroyPlayer(@NotNull Player player) { + perPlayer.remove(player.getUniqueId()); + } +} diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/EasyHoloAdapter.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/EasyHoloAdapter.java new file mode 100644 index 00000000..b2ccadc5 --- /dev/null +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/EasyHoloAdapter.java @@ -0,0 +1,62 @@ +package com.andrei1058.stevesus.api.hook.hologram.easyholo; + +import com.andrei1058.stevesus.api.arena.Arena; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramProvider; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.ConcurrentLinkedQueue; + +public class EasyHoloAdapter implements HologramProvider { + + private ConcurrentLinkedQueue trackedHolograms = new ConcurrentLinkedQueue<>(); + private Plugin plugin; + + @Override + public HologramI spawnHologram(Location location) { + var holo = new EasyHolo(location); + trackedHolograms.add(holo); + return holo; + } + + @Override + public void onArenaLeave(@NotNull Arena arena, Player player) { + if (null == arena.getWorld()) { + return; + } + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + trackedHolograms.forEach(item -> { + var world = item.getLocation().getWorld(); + if (null != world && world.getName().equals(arena.getWorld().getName())) { + item.destroyPlayer(player); + } + }); + }); + } + + @Override + public void onAdapterInit(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void onArenaDestroy(@NotNull Arena arena) { + if (null == arena.getWorld()) { + return; + } + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + trackedHolograms.forEach(item -> { + var world = item.getLocation().getWorld(); + if (null != world && world.getName().equals(arena.getWorld().getName())) { + trackedHolograms.remove(item); + item.remove(); + } + }); + }); + } + +} diff --git a/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/PerPlayer.java b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/PerPlayer.java new file mode 100644 index 00000000..fdff8f4a --- /dev/null +++ b/stevesus-api/src/main/java/com/andrei1058/stevesus/api/hook/hologram/easyholo/PerPlayer.java @@ -0,0 +1,14 @@ +package com.andrei1058.stevesus.api.hook.hologram.easyholo; + +import org.bukkit.Location; +import org.holoeasy.hologram.Hologram; +import org.jetbrains.annotations.NotNull; + +class PerPlayer extends Hologram { + public PerPlayer(@NotNull Location location) { + super(location, null, null); + } + + public void updateHologram() { + } +} diff --git a/stevesus-common/src/main/java/com/andrei1058/stevesus/common/database/DatabaseManager.java b/stevesus-common/src/main/java/com/andrei1058/stevesus/common/database/DatabaseManager.java index c00a2c71..205f7541 100644 --- a/stevesus-common/src/main/java/com/andrei1058/stevesus/common/database/DatabaseManager.java +++ b/stevesus-common/src/main/java/com/andrei1058/stevesus/common/database/DatabaseManager.java @@ -6,7 +6,6 @@ import com.andrei1058.stevesus.common.api.database.DatabaseService; import com.andrei1058.stevesus.common.database.adapter.HikariAdapter; import com.andrei1058.stevesus.common.database.adapter.NoDatabase; -import com.andrei1058.stevesus.common.database.adapter.SqlLiteAdapter; import com.andrei1058.stevesus.common.database.config.DatabaseConfig; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; diff --git a/stevesus-plugin/pom.xml b/stevesus-plugin/pom.xml index 1d2b2d85..7083f76a 100644 --- a/stevesus-plugin/pom.xml +++ b/stevesus-plugin/pom.xml @@ -147,13 +147,27 @@ 24.2 compile - + - com.andrei1058.hologramapi - hologram-api - 1.0-SNAPSHOT - compile + com.github.unldenis.holoeasy + holoeasy-core + 4.3.2 + + + org.jetbrains.kotlin + kotlin-stdlib + 1.9.21 + + + + + + com.github.retrooper + packetevents-spigot + 2.7.0 + provided + com.github.johnnyjayjay @@ -294,6 +308,26 @@ true + + org.jetbrains.kotlin + kotlin-maven-plugin + 1.9.21 + + + compile + process-sources + + compile + + + + src/main/java + target/generated-sources/annotations + + + + + diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/SteveSusArena.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/SteveSusArena.java index d8d0823f..7439d62c 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/SteveSusArena.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/SteveSusArena.java @@ -23,6 +23,7 @@ import com.andrei1058.stevesus.api.arena.vent.Vent; import com.andrei1058.stevesus.api.arena.vent.VentHandler; import com.andrei1058.stevesus.api.event.*; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.ChatUtil; import com.andrei1058.stevesus.api.locale.Locale; import com.andrei1058.stevesus.api.locale.Message; @@ -359,6 +360,8 @@ public void disable() { if (gameTask != -1) { Bukkit.getScheduler().cancelTask(gameTask); } + + HologramManager.getInstance().onArenaDestroy(this); } @Override @@ -374,6 +377,7 @@ public void restart() { GameRestartEvent gameRestartEvent = new GameRestartEvent(getGameId(), this); Bukkit.getPluginManager().callEvent(gameRestartEvent); WorldManager.getINSTANCE().getWorldAdapter().onArenaRestart(this); + HologramManager.getInstance().onArenaDestroy(this); } @Override @@ -857,6 +861,7 @@ public void removePlayer(Player player, boolean onQuit) { if (getVentHandler() != null) { getVentHandler().interruptVenting(player, true); } + HologramManager.getInstance().onArenaLeave(this, player); SteveSus.debug("Player " + player.getName() + " was removed as player from game " + getGameId() + "(" + getTemplateWorld() + ")."); } @@ -912,6 +917,7 @@ public void removeSpectator(Player player, boolean onQuit) { for (GameListener gameListener : gameListeners) { gameListener.onPlayerLeave(this, player, true); } + HologramManager.getInstance().onArenaLeave(this, player); SteveSus.debug("Player " + player.getName() + " was removed as spectator from game " + getGameId() + "(" + getTemplateWorld() + ")."); } @@ -971,7 +977,7 @@ public boolean switchState(GameState gameState) { getPlayers().forEach(player -> GameSidebarManager.getInstance().setSidebar(player, SidebarType.IN_GAME, this, false)); // refresh meeting button lines if (getMeetingButton() != null) { - getMeetingButton().onGameStart(); + getMeetingButton().onGameStart(this); getMeetingButton().refreshLines(this); getMeetingButton().setLastUsage(System.currentTimeMillis()); } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/ability/vent/VentListener.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/ability/vent/VentListener.java index b5106ab1..7e922807 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/ability/vent/VentListener.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/ability/vent/VentListener.java @@ -17,6 +17,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class VentListener implements GameListener { @@ -83,56 +84,65 @@ public void onPlayerInteractEntity(Arena arena, Player player, Entity entity) { } @Override - public void onGameStateChange(Arena arena, GameState oldState, GameState newState) { + public void onGameStateChange(@NotNull Arena arena, GameState oldState, GameState newState) { if (arena.getVentHandler() == null) return; if (newState == GameState.IN_GAME) { for (Vent vent : arena.getVentHandler().getVents()) { - vent.getHologram().show(); + if (null == vent.getHologram()) { + continue; + } + vent.getHologram().hideToAll(); for (Team team : arena.getGameTeams()) { - if (team.isInnocent()) { - team.getMembers().forEach(mem -> vent.getHologram().hide(mem)); + if (!team.isInnocent()) { + team.getMembers().forEach(mem -> vent.getHologram().showToPlayer(mem)); } } - for (Player spectator : arena.getSpectators()) { - vent.getHologram().hide(spectator); - } } } } @Override - public void onPlayerJoin(Arena arena, Player player) { + public void onPlayerJoin(@NotNull Arena arena, Player player) { if (arena.getVentHandler() == null) return; if (arena.getGameState() == GameState.IN_GAME) { for (Vent vent : arena.getVentHandler().getVents()) { - vent.getHologram().hide(player); + if (null == vent.getHologram()){ + continue; + } + vent.getHologram().hideFromPlayer(player); } } } @Override - public void onPlayerToSpectator(Arena arena, Player player) { + public void onPlayerToSpectator(@NotNull Arena arena, Player player) { if (arena.getVentHandler() == null) return; for (Vent vent : arena.getVentHandler().getVents()) { - vent.getHologram().hide(player); + if (null == vent.getHologram()){ + continue; + } + vent.getHologram().hideFromPlayer(player); } } @Override - public void onPlayerMove(Arena arena, Player player, Location from, @Nullable Team playerTeam) { + public void onPlayerMove(@NotNull Arena arena, Player player, Location from, @Nullable Team playerTeam) { if (arena.getVentHandler() == null) return; if (arena.getGameState() != GameState.IN_GAME) return; if (playerTeam == null) return; if (playerTeam.isInnocent()) return; for (Vent vent : arena.getVentHandler().getVents()) { + if (null == vent.getHologram()){ + continue; + } int distance = (int) player.getLocation().distance(vent.getBlock().getLocation()); if (vent.getHologram().isHiddenFor(player)) { if (distance <= 7) { - vent.getHologram().show(player); + vent.getHologram().showToPlayer(player); } } else { if (distance > 7) { - vent.getHologram().hide(player); + vent.getHologram().hideFromPlayer(player); } } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/emptygarbage/EmptyGarbageTaskProvider.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/emptygarbage/EmptyGarbageTaskProvider.java index 0bdbb1f0..033d0f69 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/emptygarbage/EmptyGarbageTaskProvider.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/emptygarbage/EmptyGarbageTaskProvider.java @@ -1,8 +1,5 @@ package com.andrei1058.stevesus.arena.gametask.emptygarbage; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.task.GameTask; @@ -10,6 +7,8 @@ import com.andrei1058.stevesus.api.arena.task.TaskType; import com.andrei1058.stevesus.api.glow.GlowColor; import com.andrei1058.stevesus.api.glow.GlowingBox; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.api.server.multiarena.InventoryBackup; import com.andrei1058.stevesus.api.setup.SetupListener; @@ -246,7 +245,7 @@ public void onSetupLoad(SetupSession setupSession, String localName, JsonObject SteveSus.newChain().delay(20).sync(() -> { List glowingBoxes = new ArrayList<>(); - List holograms = new ArrayList<>(); + List holograms = new ArrayList<>(); for (JsonElement element : array) { JsonObject obj = element.getAsJsonObject(); @@ -271,24 +270,34 @@ public void onSetupLoad(SetupSession setupSession, String localName, JsonObject glowingBoxes.add(glowingBox); glowingBox.startGlowing(setupSession.getPlayer()); - Hologram hologram = new Hologram(location, 2); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + " - &fGARBAGE POINT")); - page.setLineContent(1, new LineTextContent(s -> localName)); - holograms.add(hologram); + var holo = HologramManager.getInstance().makeUnsafe( + location, + Arrays.asList( + r -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + " - &fGARBAGE POINT", + r -> localName + ) + ); + + if (null != holo) { + holograms.add(holo); + } } if (drop != null) { GlowingBox glowingBox = new GlowingBox(drop.clone().add(0.5, 0, 0.5), 2, GlowColor.GREEN); glowingBoxes.add(glowingBox); glowingBox.startGlowing(setupSession.getPlayer()); - Hologram hologram = new Hologram(drop, 2); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + " - &fDROP POINT")); - page.setLineContent(1, new LineTextContent(s -> localName)); - holograms.add(hologram); + var holo = HologramManager.getInstance().makeUnsafe( + location, + Arrays.asList( + r -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + " - &fDROP POINT", + r -> localName + ) + ); + if (null != holo) { + + } + holograms.add(holo); } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTask.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTask.java index 9d5a182e..e0c666be 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTask.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTask.java @@ -41,10 +41,10 @@ public FuelEnginesTask(String localName, LinkedList availableStages, public void onPlayerJoin(Arena arena, Player player) { for (FuelStage fuelStage : availableStages) { if (fuelStage.getEngineHologram() != null) { - fuelStage.getEngineHologram().hide(player); + fuelStage.getEngineHologram().hideFromPlayer(player); } if (fuelStage.getStorageHologram() != null) { - fuelStage.getStorageHologram().hide(player); + fuelStage.getStorageHologram().hideFromPlayer(player); } } } @@ -154,14 +154,14 @@ private void enableIndicator(Player player) { stage.getEngineGlowing().startGlowing(player); } if (stage.getEngineHologram() != null) { - stage.getEngineHologram().show(player); + stage.getEngineHologram().showToPlayer(player); } } else { if (stage.getStorageGlowing() != null) { stage.getStorageGlowing().startGlowing(player); } if (stage.getStorageHologram() != null) { - stage.getStorageHologram().show(player); + stage.getStorageHologram().showToPlayer(player); } } } @@ -177,14 +177,14 @@ private void disableIndicator(Player player) { stage.getEngineGlowing().stopGlowing(player); } if (stage.getEngineHologram() != null) { - stage.getEngineHologram().hide(player); + stage.getEngineHologram().hideFromPlayer(player); } } else { if (stage.getStorageGlowing() != null) { stage.getStorageGlowing().stopGlowing(player); } if (stage.getStorageHologram() != null) { - stage.getStorageHologram().hide(player); + stage.getStorageHologram().hideFromPlayer(player); } } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTaskProvider.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTaskProvider.java index b5cf1881..3895947a 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTaskProvider.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelEnginesTaskProvider.java @@ -11,7 +11,6 @@ import com.andrei1058.stevesus.api.setup.util.SaveTaskItem; import com.andrei1058.stevesus.api.setup.util.SelectTargetBlocks; import com.andrei1058.stevesus.arena.ArenaManager; -import com.andrei1058.stevesus.arena.gametask.emptygarbage.OrderPriority; import com.andrei1058.stevesus.common.gui.ItemUtil; import com.andrei1058.stevesus.config.properties.OrphanLocationProperty; import com.google.gson.JsonArray; @@ -27,7 +26,6 @@ import java.util.Arrays; import java.util.LinkedList; -import java.util.function.Function; public class FuelEnginesTaskProvider extends TaskProvider { diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelStage.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelStage.java index fd2e8faa..94511bb9 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelStage.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/fuelengines/FuelStage.java @@ -1,12 +1,11 @@ package com.andrei1058.stevesus.arena.gametask.fuelengines; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.task.GameTask; import com.andrei1058.stevesus.api.glow.GlowColor; import com.andrei1058.stevesus.api.glow.GlowingBox; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Locale; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.hook.glowing.GlowingManager; @@ -16,6 +15,7 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.UUID; import java.util.WeakHashMap; @@ -23,8 +23,8 @@ public class FuelStage { private GlowingBox storageGlowing; private GlowingBox engineGlowing; - private Hologram storageHologram; - private Hologram engineHologram; + private @Nullable HologramI storageHologram; + private @Nullable HologramI engineHologram; private final WeakHashMap nextAllowed = new WeakHashMap<>(); public FuelStage(@Nullable Location storage, @Nullable Location reactor) { @@ -46,26 +46,32 @@ public GlowingBox getEngineGlowing() { return engineGlowing; } - public Hologram getStorageHologram() { + public @Nullable HologramI getStorageHologram() { return storageHologram; } - public Hologram getEngineHologram() { + public @Nullable HologramI getEngineHologram() { return engineHologram; } public void initHolograms(GameTask task) { if (getStorageGlowing() != null) { - storageHologram = new Hologram(getStorageGlowing().getMagmaCube().getLocation().add(0, 0.5, 0), 1); - HologramPage page1 = storageHologram.getPage(0); - assert page1 != null; - page1.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.GAME_TASK_PATH_.toString() + task.getHandler().getIdentifier() + "-" + task.getLocalName() + "holo1"))); + storageHologram = HologramManager.getInstance().makeUnsafe( + getStorageGlowing().getMagmaCube().getLocation().add(0, 0.5, 0), + List.of(r -> LanguageManager.getINSTANCE().getMsg(r, + Message.GAME_TASK_PATH_ + task.getHandler().getIdentifier() + + "-" + task.getLocalName() + "holo1") + ) + ); } if (getEngineGlowing() != null) { - engineHologram = new Hologram(getEngineGlowing().getMagmaCube().getLocation().add(0, 0.5, 0), 1); - HologramPage page2 = engineHologram.getPage(0); - assert page2 != null; - page2.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.GAME_TASK_PATH_.toString() + task.getHandler().getIdentifier() + "-" + task.getLocalName() + "holo2"))); + engineHologram = HologramManager.getInstance().makeUnsafe( + getEngineGlowing().getMagmaCube().getLocation().add(0, 0.5, 0), + List.of(r -> LanguageManager.getINSTANCE().getMsg(r, + Message.GAME_TASK_PATH_ + task.getHandler().getIdentifier() + + "-" + task.getLocalName() + "holo2") + ) + ); } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsProvider.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsProvider.java index ec966d07..22c9777c 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsProvider.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsProvider.java @@ -1,13 +1,12 @@ package com.andrei1058.stevesus.arena.gametask.manifolds; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.task.GameTask; import com.andrei1058.stevesus.api.arena.task.TaskProvider; import com.andrei1058.stevesus.api.arena.task.TaskType; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.server.GameSound; import com.andrei1058.stevesus.api.server.multiarena.InventoryBackup; import com.andrei1058.stevesus.api.setup.SetupListener; @@ -32,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; +import java.util.List; public class UnlockManifoldsProvider extends TaskProvider { @@ -98,7 +98,7 @@ public void onSetupRequest(Player player, SetupSession setupSession, String loca player.getInventory().setHeldItemSlot(5); final Shulker[] shulkerEntity = {null}; - final Hologram[] hologram = {null}; + final HologramI[] hologram = {null}; setupSession.addSetupListener("unlockManifolds_" + localName, new SetupListener() { @Override @@ -155,12 +155,16 @@ public void onBlockPlace(SetupSession setupSession, BlockPlaceEvent event) { shulkerEntity[0].setSilent(true); shulkerEntity[0].setMetadata(localName, new FixedMetadataValue(SteveSus.getInstance(), localName)); player.sendMessage("Task location set!"); - hologram[0] = new Hologram(event.getBlockPlaced().getLocation(), 1); - HologramPage page = hologram[0].getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + "(" + localName + ")")); - hologram[0].refreshLines(); - event.setCancelled(true); + + var holoManager = HologramManager.getInstance().getProvider(); + if (null != holoManager) { + hologram[0] = holoManager.spawnHologram(event.getBlockPlaced().getLocation()); + hologram[0].setPageContent(List.of( + receiver -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + "(" + localName + ")") + ); + hologram[0].refreshForAll(); + event.setCancelled(true); + } } } @@ -189,11 +193,14 @@ public void onSetupLoad(SetupSession setupSession, String localName, JsonObject if (location == null) return; location.setWorld(Bukkit.getWorld(setupSession.getWorldName())); - Hologram hologram = new Hologram(location, 1); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + "(" + localName + ")")); - hologram.refreshLines(); + var holoAdapter = HologramManager.getInstance().getProvider(); + + if (null != holoAdapter) { + var holo = holoAdapter.spawnHologram(location); + holo.setPageContent(List.of( + receiver -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()) + "(" + localName + ")") + ); + } } @Override diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsTask.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsTask.java index 9eb4ddd5..c0e5dc97 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsTask.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/manifolds/UnlockManifoldsTask.java @@ -1,8 +1,5 @@ package com.andrei1058.stevesus.arena.gametask.manifolds; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.GameListener; @@ -11,6 +8,8 @@ import com.andrei1058.stevesus.api.event.PlayerTaskDoneEvent; import com.andrei1058.stevesus.api.glow.GlowColor; import com.andrei1058.stevesus.api.glow.GlowingBox; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Locale; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.common.api.arena.GameState; @@ -21,7 +20,10 @@ import org.bukkit.block.Block; import org.bukkit.entity.*; import org.bukkit.event.player.PlayerInteractEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.HashMap; import java.util.Set; import java.util.UUID; @@ -32,7 +34,7 @@ public class UnlockManifoldsTask extends GameTask { private final HashMap assignedPlayers = new HashMap<>(); private final Arena arena; private final Block shulkerBlock; - private final Hologram hologram; + private @Nullable HologramI hologram = null; private final GlowingBox glowingBox; public UnlockManifoldsTask(String localName, Arena arena, Location location) { @@ -44,13 +46,17 @@ public UnlockManifoldsTask(String localName, Arena arena, Location location) { shulkerBlock.setType(Material.BLACK_SHULKER_BOX); glowingBox = new GlowingBox(location, 2, GlowColor.YELLOW); - hologram = new Hologram(location.clone().add(0, 2, 0), 2); - hologram.allowCollisions(false); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.GAME_TASK_NAME_PATH_.toString() + getHandler().getIdentifier()))); - page.setLineContent(1, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.GAME_TASK_DESCRIPTION_PATH_.toString() + getHandler().getIdentifier()))); - hologram.hide(); + var holoProvider = HologramManager.getInstance().getProvider(); + + if (null != holoProvider) { + hologram = holoProvider.spawnHologram(location.clone().add(0, 2, 0)); + hologram.setPageContent(Arrays.asList( + player -> LanguageManager.getINSTANCE().getMsg(player, Message.GAME_TASK_NAME_PATH_ + getHandler().getIdentifier()), + player -> LanguageManager.getINSTANCE().getMsg(player, Message.GAME_TASK_DESCRIPTION_PATH_ + getHandler().getIdentifier()) + )); + hologram.hideToAll(); + } + arena.registerGameListener(new GameListener() { @Override @@ -80,14 +86,16 @@ public void onPlayerInteract(Arena arena, Player player, PlayerInteractEvent eve @Override public void onGameStateChange(Arena arena, GameState oldState, GameState newState) { if (newState == GameState.IN_GAME) { - + if (null == hologram) { + return; + } // hide hologram for those who do not have this task for (Player player : arena.getPlayers()) { if (!hasTask(player)) { - hologram.hide(player); + hologram.hideFromPlayer(player); } } - hologram.show(); + hologram.unHide(); } } }); @@ -159,36 +167,46 @@ public boolean isDoingTask(Player player) { @Override public void enableIndicators() { + if (null == hologram) { + return; + } + for (Player player : arena.getPlayers()) { if (hasTask(player) && (getCurrentStage(player) != getTotalStages(player))) { getGlowingBox().startGlowing(player); - hologram.hide(player); + hologram.hideFromPlayer(player); } } } @Override public void disableIndicators() { + if (null == hologram) { + return; + } + for (Player player : arena.getPlayers()) { if (hasTask(player)) { getGlowingBox().stopGlowing(player); - hologram.show(player); + hologram.showToPlayer(player); } } } - public void markDone(Player player) { + public void markDone(@NotNull Player player) { player.closeInventory(); assignedPlayers.replace(player.getUniqueId(), true); arena.refreshTaskMeter(); arena.getGameEndConditions().tickGameEndConditions(arena); getGlowingBox().stopGlowing(player); - hologram.hide(player); + if (null != hologram) { + hologram.hideFromPlayer(player); + } PlayerTaskDoneEvent taskDoneEvent = new PlayerTaskDoneEvent(arena, this, player); Bukkit.getPluginManager().callEvent(taskDoneEvent); } - private void tryOpenGUI(Player player, Arena arena) { + private void tryOpenGUI(Player player, @NotNull Arena arena) { if (!arena.isTasksAllowedATM()) return; if (hasTask(player)) { if (arena.getCamHandler() != null && arena.getCamHandler().isOnCam(player, arena)) return; diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/primeshields/PrimeShieldsTaskProvider.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/primeshields/PrimeShieldsTaskProvider.java index 40deb9d1..fb6bf326 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/primeshields/PrimeShieldsTaskProvider.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/primeshields/PrimeShieldsTaskProvider.java @@ -1,8 +1,5 @@ package com.andrei1058.stevesus.arena.gametask.primeshields; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.task.GameTask; @@ -10,13 +7,14 @@ import com.andrei1058.stevesus.api.arena.task.TaskType; import com.andrei1058.stevesus.api.glow.GlowColor; import com.andrei1058.stevesus.api.glow.GlowingBox; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.server.multiarena.InventoryBackup; import com.andrei1058.stevesus.api.setup.SetupListener; import com.andrei1058.stevesus.api.setup.SetupSession; import com.andrei1058.stevesus.api.setup.util.SaveTaskItem; import com.andrei1058.stevesus.api.setup.util.SelectTargetBlock; import com.andrei1058.stevesus.arena.ArenaManager; -import com.andrei1058.stevesus.arena.gametask.startreactor.StartReactorTask; import com.andrei1058.stevesus.config.properties.OrphanLocationProperty; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -27,7 +25,7 @@ import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.Nullable; -import java.util.function.Function; +import java.util.Arrays; public class PrimeShieldsTaskProvider extends TaskProvider { @@ -130,14 +128,23 @@ public void onSetupLoad(SetupSession setupSession, String localName, JsonObject GlowingBox glowingBox = new GlowingBox(location.clone().add(0.5, 0, 0.5), 2, GlowColor.GREEN); glowingBox.startGlowing(setupSession.getPlayer()); - Hologram hologram = new Hologram(location, 2); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()))); - page.setLineContent(1, new LineTextContent(s -> localName)); + var holoManager = HologramManager.getInstance().getProvider(); + HologramI hologram = null; + if (null != holoManager) { + hologram = holoManager.spawnHologram(location); + hologram.setPageContent( + Arrays.asList( + player -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()), + player -> localName + ) + ); + } + // cache objects so they can be removed if player decides to remove this configuration - setupSession.cacheValue(getIdentifier() + "-" + localName + "-holo", hologram); + if (null != hologram) { + setupSession.cacheValue(getIdentifier() + "-" + localName + "-holo", hologram); + } setupSession.cacheValue(getIdentifier() + "-" + localName + "-glowing", glowingBox); }).execute(); } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanProvider.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanProvider.java index 4d54f8e3..e2b4c414 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanProvider.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanProvider.java @@ -1,13 +1,11 @@ package com.andrei1058.stevesus.arena.gametask.scan; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.task.TaskProvider; -import com.andrei1058.stevesus.api.arena.task.TaskTriggerType; import com.andrei1058.stevesus.api.arena.task.TaskType; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.server.GameSound; import com.andrei1058.stevesus.api.setup.SetupListener; import com.andrei1058.stevesus.api.setup.SetupSession; @@ -28,12 +26,10 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.Nullable; -import org.json.simple.JSONObject; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.function.Function; @@ -98,9 +94,9 @@ public void onSetupRequest(Player player, SetupSession setupSession, String loca double minRange = 1; Arrays.asList(" ", " ", - ChatColor.AQUA + "1." + ChatColor.RESET + " Use the items in your inventory to adjust task settings.", - ChatColor.AQUA + "2." + ChatColor.RESET + " You can increase and decrease this task's usage radius (Capsule radius). When set to " + minRange + " players will need to stand on the exact scan location block.", - ChatColor.AQUA + "3." + ChatColor.RESET + " You can increase and decrease how long it takes to scan.") + ChatColor.AQUA + "1." + ChatColor.RESET + " Use the items in your inventory to adjust task settings.", + ChatColor.AQUA + "2." + ChatColor.RESET + " You can increase and decrease this task's usage radius (Capsule radius). When set to " + minRange + " players will need to stand on the exact scan location block.", + ChatColor.AQUA + "3." + ChatColor.RESET + " You can increase and decrease how long it takes to scan.") .forEach(player::sendMessage); ItemStack saveAndClose = ItemUtil.createItem("BOOK", (byte) 0, 1, true, Arrays.asList("customTaskItem", "saveAndClose"), ChatColor.RED + "" + ChatColor.BOLD + "Save and close: " + ChatColor.RESET + getDefaultDisplayName(), null); @@ -128,7 +124,7 @@ public void onSetupRequest(Player player, SetupSession setupSession, String loca final int[] currentSeconds = {minSeconds}; Location[] scanCapsuleLocation = {null}; - Hologram[] scanCapsuleHologram = {null}; + HologramI[] scanCapsuleHologram = {null}; // save and close task setup. final boolean[] preventCalledTwice = {false}; @@ -167,16 +163,19 @@ public void onSetupRequest(Player player, SetupSession setupSession, String loca Function setScanLoc = location -> { if (scanCapsuleHologram[0] != null) { - scanCapsuleHologram[0].hide(); + scanCapsuleHologram[0].hideToAll(); + } + var holoManager = HologramManager.getInstance().getProvider(); + if (null != holoManager) { + scanCapsuleHologram[0] = holoManager.spawnHologram(location.clone().add(0, 2, 0)); + scanCapsuleHologram[0].setPageContent(Arrays.asList( + receiver -> "&b&lSubmit Scan", + receiver -> "&fSet here! (" + localName + ")" + )); + scanCapsuleLocation[0] = location; + scanCapsuleHologram[0].hideFromPlayer(player); + scanCapsuleHologram[0].showToPlayer(player); } - scanCapsuleHologram[0] = new Hologram(location, 2); - HologramPage page = scanCapsuleHologram[0].getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> "&b&lSubmit Scan")); - page.setLineContent(1, new LineTextContent(s -> "&fSet here! (" + localName + ")")); - scanCapsuleLocation[0] = location; - scanCapsuleHologram[0].hide(player); - scanCapsuleHologram[0].show(player); player.sendTitle(" ", ChatColor.AQUA + "Scan location set!", 0, 50, 0); GameSound.JOIN_SOUND_CURRENT.playToPlayer(player); particleLocations.clear(); @@ -269,14 +268,20 @@ public void onSetupLoad(SetupSession setupSession, String localName, JsonObject }), 0L, 10).getTaskId(); setupSession.cacheValue("submit_scan_task_id_" + localName, particlesTask); - Hologram hologram = new Hologram(location.add(0, 1.7, 0), 2); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> "&b&lSubmit Scan")); - page.setLineContent(1, new LineTextContent(s -> "&fSet here! (" + localName + ")")); - hologram.hide(setupSession.getPlayer()); - hologram.show(setupSession.getPlayer()); - setupSession.cacheValue("submit_scan_" + localName, hologram); + HologramI hologram = null; + var holoManager = HologramManager.getInstance().getProvider(); + if (null != holoManager) { + hologram = holoManager.spawnHologram(location.add(0, 1.7, 0)); + hologram.setPageContent(Arrays.asList( + receiver -> "&b&lSubmit Scan", + receiver -> "&fSet here! (" + localName + ")" + )); + hologram.hideFromPlayer(setupSession.getPlayer()); + hologram.showToPlayer(setupSession.getPlayer()); + } + if (null != hologram) { + setupSession.cacheValue("submit_scan_" + localName, hologram); + } } @Override @@ -289,9 +294,9 @@ public void onSetupClose(SetupSession setupSession, String localName, JsonObject @Override public void onRemove(SetupSession setupSession, String localName, JsonObject configData) { - Hologram hologram = (Hologram) setupSession.getCachedValue("submit_scan_" + localName); + HologramI hologram = (HologramI) setupSession.getCachedValue("submit_scan_" + localName); if (hologram != null) { - hologram.hide(); + hologram.remove(); setupSession.removeCacheValue("submit_scan_" + localName); } Object cached = setupSession.getCachedValue("submit_scan_task_id_" + localName); diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanTask.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanTask.java index 8e43f54d..51303391 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanTask.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/scan/SubmitScanTask.java @@ -1,8 +1,5 @@ package com.andrei1058.stevesus.arena.gametask.scan; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.GameListener; @@ -10,12 +7,16 @@ import com.andrei1058.stevesus.api.arena.task.TaskProvider; import com.andrei1058.stevesus.api.arena.team.Team; import com.andrei1058.stevesus.api.event.PlayerTaskDoneEvent; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.common.api.arena.GameState; import com.andrei1058.stevesus.language.LanguageManager; import org.bukkit.*; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -23,7 +24,7 @@ public class SubmitScanTask extends GameTask { private final double capsuleRadius; private int scanDuration; - private final Hologram taskHologram; + private @Nullable HologramI taskHologram = null; private final List scanParticles; private final Location scanCapsuleLocation; // one scan at a time. @@ -33,14 +34,18 @@ public class SubmitScanTask extends GameTask { public SubmitScanTask(double radius, int scanDuration, Location capsuleLocation, Arena arena, String localName) { super(localName); this.scanCapsuleLocation = capsuleLocation.clone(); - this.scanCapsuleLocation.add(0, 1, 0); + this.scanCapsuleLocation.add(0, 0.3, 0); this.capsuleRadius = radius; this.scanDuration = scanDuration; - this.taskHologram = new Hologram(capsuleLocation.clone().add(0, 1.8, 0), 2); - HologramPage page = taskHologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.GAME_TASK_NAME_PATH_.toString() + getHandler().getIdentifier()))); - page.setLineContent(1, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.GAME_TASK_DESCRIPTION_PATH_.toString() + getHandler().getIdentifier()))); + + var holoManager = HologramManager.getInstance().getProvider(); + if (null != holoManager) { + this.taskHologram = holoManager.spawnHologram(capsuleLocation.clone().add(0, 1.8, 0)); + this.taskHologram.setPageContent(Arrays.asList( + receiver -> LanguageManager.getINSTANCE().getMsg(receiver, Message.GAME_TASK_NAME_PATH_ + getHandler().getIdentifier()), + receiver -> LanguageManager.getINSTANCE().getMsg(receiver, Message.GAME_TASK_DESCRIPTION_PATH_ + getHandler().getIdentifier()) + )); + } scanParticles = new ArrayList<>(SubmitScanProvider.getInstance().getCircle(capsuleLocation.add(0, 0.3, 0), radius, 15)); @@ -83,7 +88,7 @@ public int getTotalStages(UUID player) { } @Override - public void assignToPlayer(Player player, Arena arena) { + public void assignToPlayer(@NotNull Player player, Arena arena) { assignedPlayers.remove(player.getUniqueId()); assignedPlayers.put(player.getUniqueId(), 0); } @@ -94,7 +99,7 @@ public Set getAssignedPlayers() { } @Override - public boolean hasTask(Player player) { + public boolean hasTask(@NotNull Player player) { return assignedPlayers.containsKey(player.getUniqueId()); } @@ -105,12 +110,19 @@ public boolean isDoingTask(Player player) { @Override public void enableIndicators() { - taskHologram.show(); + if (null == taskHologram) { + return; + } + // fixme show to all? + taskHologram.unHide(); } @Override public void disableIndicators() { - taskHologram.hide(); + if (null == taskHologram) { + return; + } + taskHologram.hideToAll(); } @@ -177,7 +189,9 @@ private void cancelScan(boolean done, Player player, Arena arena) { Bukkit.getScheduler().cancelTask(currentScanTask); } if (done) { - taskHologram.hide(player); + if (null != taskHologram) { + taskHologram.hideFromPlayer(player); + } assignedPlayers.replace(currentScan, 1); player.sendTitle(" ", LanguageManager.getINSTANCE().getMsg(player, SubmitScanProvider.MSG_SCANNING_DONE), 0, 10, 0); player.playSound(player.getLocation(), Sound.ENTITY_CAT_PURREOW, 1, 1); @@ -216,9 +230,12 @@ public void onPlayerToggleSneakEvent(Arena arena, Player player, boolean isSneak @Override public void onGameStateChange(Arena arena, GameState oldState, GameState newState) { if (newState == GameState.IN_GAME) { + if (null == taskHologram){ + return; + } for (Player player : arena.getPlayers()) { if (hasTask(player)) { - taskHologram.show(player); + taskHologram.showToPlayer(player); } } } @@ -226,7 +243,10 @@ public void onGameStateChange(Arena arena, GameState oldState, GameState newStat @Override public void onPlayerJoin(Arena arena, Player player) { - taskHologram.hide(player); + if (null == taskHologram) { + return; + } + taskHologram.hideFromPlayer(player); } } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/startreactor/StartReactorTaskProvider.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/startreactor/StartReactorTaskProvider.java index fc976624..e0ec5514 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/startreactor/StartReactorTaskProvider.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/startreactor/StartReactorTaskProvider.java @@ -1,8 +1,5 @@ package com.andrei1058.stevesus.arena.gametask.startreactor; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.task.GameTask; @@ -10,6 +7,8 @@ import com.andrei1058.stevesus.api.arena.task.TaskType; import com.andrei1058.stevesus.api.glow.GlowColor; import com.andrei1058.stevesus.api.glow.GlowingBox; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.server.multiarena.InventoryBackup; import com.andrei1058.stevesus.api.setup.SetupListener; import com.andrei1058.stevesus.api.setup.SetupSession; @@ -26,7 +25,7 @@ import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.Nullable; -import java.util.function.Function; +import java.util.Arrays; public class StartReactorTaskProvider extends TaskProvider { @@ -129,14 +128,20 @@ public void onSetupLoad(SetupSession setupSession, String localName, JsonObject GlowingBox glowingBox = new GlowingBox(location.clone().add(0.5, 0, 0.5), 2, GlowColor.GREEN); glowingBox.startGlowing(setupSession.getPlayer()); - Hologram hologram = new Hologram(location, 2); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()))); - page.setLineContent(1, new LineTextContent(s -> localName)); + var holoManager = HologramManager.getInstance().getProvider(); + HologramI holo = null; + if (null != holoManager) { + holo = holoManager.spawnHologram(location); + holo.setPageContent(Arrays.asList( + r -> ChatColor.translateAlternateColorCodes('&', getDefaultDisplayName()), + r -> localName + )); + } // cache objects so they can be removed if player decides to remove this configuration - setupSession.cacheValue(getIdentifier() + "-" + localName + "-holo", hologram); + if (null != holo) { + setupSession.cacheValue(getIdentifier() + "-" + localName + "-holo", holo); + } setupSession.cacheValue(getIdentifier() + "-" + localName + "-glowing", glowingBox); }).execute(); } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/UploadTask.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/UploadTask.java index 75ebb7b9..184c8bb2 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/UploadTask.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/UploadTask.java @@ -20,6 +20,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; import java.util.*; import java.util.stream.Collectors; @@ -52,7 +53,9 @@ public void markPanelFinished(Player player, Arena arena) { // already finished; return; } - panel.getHologram().hide(player); + if (null != panel.getHologram()) { + panel.getHologram().hideFromPlayer(player); + } GlowingManager.getInstance().removeGlowing(panel.getItemFrame(), player); int taskId = currentlyDoing.remove(player.getUniqueId()); Bukkit.getScheduler().cancelTask(taskId); @@ -70,7 +73,9 @@ public void markPanelFinished(Player player, Arena arena) { WallPanel newPanel = nextPanel.get(0); currentPlayerStage.remove(player.getUniqueId()); currentPlayerStage.put(player.getUniqueId(), newPanel); - newPanel.getHologram().show(player); + if (null != newPanel.getHologram()) { + newPanel.getHologram().showToPlayer(player); + } GlowingManager.setGlowingBlue(newPanel.getItemFrame(), player); player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1); GameRoom room = arena.getRoom(newPanel.getItemFrame().getLocation()); @@ -104,30 +109,27 @@ public void onPlayerInteractEntity(Arena arena, Player player, Entity entity) { @Override public void onGameStateChange(Arena arena, GameState oldState, GameState newState) { if (newState == GameState.IN_GAME) { - panels.forEach(panel -> { - arena.getPlayers().forEach(player -> { - if (!GlowingManager.isGlowing(panel.getItemFrame(), player)) { - if (panel.getHologram() != null) { - panel.getHologram().hide(player); - } - } else { - if (panel.getHologram() != null) { - panel.getHologram().show(player); - } + for (Player player : arena.getPlayers()) { + if (!hasTask(player)) { + continue; + } + for (WallPanel panel : panels) { + if (null == panel.getHologram()) { + continue; } - }); - if (panel.getHologram() != null) { - panel.getHologram().show(); + panel.getHologram().showToPlayer(player); } - }); + } } } @Override - public void onPlayerJoin(Arena arena, Player player) { + public void onPlayerJoin(@NotNull Arena arena, Player player) { if (arena.getGameState() == GameState.IN_GAME) { for (WallPanel panel : panels) { - panel.getHologram().hide(player); + if (null != panel.getHologram()) { + panel.getHologram().hideFromPlayer(player); + } } } else { // hide existing glowing diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/panel/WallPanel.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/panel/WallPanel.java index 5c064ea2..bf69de0a 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/panel/WallPanel.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/upload/panel/WallPanel.java @@ -1,10 +1,9 @@ package com.andrei1058.stevesus.arena.gametask.upload.panel; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.arena.gametask.upload.UploadTaskProvider; import com.andrei1058.stevesus.language.LanguageManager; import com.github.johnnyjayjay.spigotmaps.MapBuilder; @@ -14,10 +13,12 @@ import org.bukkit.Location; import org.bukkit.entity.ItemFrame; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; +import java.util.List; public class WallPanel { @@ -26,7 +27,7 @@ public enum PanelType { } private final ItemFrame itemFrame; - private Hologram hologram; + private @Nullable HologramI hologram = null; private final PanelType panelType; public WallPanel(Arena arena, Location location, PanelType panelType) { @@ -54,12 +55,21 @@ public WallPanel(Arena arena, Location location, PanelType panelType) { e.printStackTrace(); } - this.hologram = new Hologram(itemFrame.getLocation().clone().add(0, 1, 0).add((itemFrame.getLocation().getDirection().normalize())), 1); - HologramPage page = this.hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, getPanelType() == PanelType.DOWNLOAD ? UploadTaskProvider.DOWNLOAD_PANEL_HOLO : UploadTaskProvider.UPLOAD_PANEL_HOLO))); - hologram.hide(); - hologram.allowCollisions(false); + var holoManager = HologramManager.getInstance().getProvider(); + if (null != holoManager) { + var holo = holoManager.spawnHologram( + itemFrame.getLocation().clone().add(0, 1, 0) + .add((itemFrame.getLocation().getDirection().normalize())) + ); + holo.setPageContent(List.of( + r -> LanguageManager.getINSTANCE().getMsg(r, + getPanelType() == PanelType.DOWNLOAD ? + UploadTaskProvider.DOWNLOAD_PANEL_HOLO : + UploadTaskProvider.UPLOAD_PANEL_HOLO + ) + )); + holo.hideToAll(); + } } public PanelType getPanelType() { @@ -70,7 +80,7 @@ public ItemFrame getItemFrame() { return itemFrame; } - public Hologram getHologram() { + public @Nullable HologramI getHologram() { return hologram; } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/FixWiringTask.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/FixWiringTask.java index 6698e359..6a88a63c 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/FixWiringTask.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/FixWiringTask.java @@ -20,6 +20,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; import java.util.*; import java.util.stream.Collectors; @@ -255,27 +256,26 @@ public void onPlayerInteractEntity(Arena arena, Player player, Entity entity) { @Override public void onGameStateChange(Arena arena, GameState oldState, GameState newState) { if (newState == GameState.IN_GAME) { - wallPanels.forEach(panel -> { - arena.getPlayers().forEach(player -> { - if (!(hasTask(player) && GlowingManager.isGlowing(panel.getItemFrame(), player))) { - if (panel.getHologram() != null) { - panel.getHologram().hide(player); - } + for (Player player : arena.getPlayers()) { + if (!hasTask(player)) { + continue; + } + for (WallPanel panel : wallPanels) { + if (null == panel.getHologram()) { + continue; } - }); - if (panel.getHologram() != null) { - panel.getHologram().show(); + panel.getHologram().showToPlayer(player); } - }); + } } } @Override - public void onPlayerJoin(Arena arena, Player player) { + public void onPlayerJoin(@NotNull Arena arena, Player player) { if (arena.getGameState() == GameState.IN_GAME) { wallPanels.forEach(panel -> { if (panel.getHologram() != null) { - panel.getHologram().hide(player); + panel.getHologram().hideFromPlayer(player); } }); } else { diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/panel/WallPanel.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/panel/WallPanel.java index 322c19ac..57c76b34 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/panel/WallPanel.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/gametask/wiring/panel/WallPanel.java @@ -1,10 +1,9 @@ package com.andrei1058.stevesus.arena.gametask.wiring.panel; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Locale; import com.andrei1058.stevesus.arena.gametask.wiring.FixWiringProvider; import com.andrei1058.stevesus.arena.gametask.wiring.FixWiringTask; @@ -19,10 +18,13 @@ import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; +import java.util.List; import java.util.UUID; public class WallPanel { @@ -30,11 +32,11 @@ public class WallPanel { private final int wiresAmount; private final FixWiringTask.PanelFlag flag; private final ItemFrame itemFrame; - private Hologram hologram; + private @Nullable HologramI hologram = null; private int assignments = 0; - public WallPanel(Arena arena, int x, int y, int z, int wiresAmount, FixWiringTask.PanelFlag flag) { + public WallPanel(@NotNull Arena arena, int x, int y, int z, int wiresAmount, FixWiringTask.PanelFlag flag) { this.wiresAmount = wiresAmount; this.flag = flag; @@ -45,7 +47,6 @@ public WallPanel(Arena arena, int x, int y, int z, int wiresAmount, FixWiringTas } this.itemFrame.setItem(null); - try { BufferedImage catImage = ImageIO.read(this.getClass().getResource("wiring_panel.png")); // read an image from a source, e.g. a file catImage = ImageTools.resizeToMapSize(catImage); // resize the image to the minecraft map size @@ -61,12 +62,19 @@ public WallPanel(Arena arena, int x, int y, int z, int wiresAmount, FixWiringTas e.printStackTrace(); } - this.hologram = new Hologram(itemFrame.getLocation().clone().add(0,1,0).add((itemFrame.getLocation().getDirection().normalize()))/*.add(itemFrame.getLocation().getDirection())*/, 1); - HologramPage page = this.hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, FixWiringProvider.PANEL_HOLO))); - hologram.hide(); - hologram.allowCollisions(false); + var holoManager = HologramManager.getInstance().getProvider(); + + if (null != holoManager) { + this.hologram = holoManager.spawnHologram( + itemFrame.getLocation().clone().add(0, 1, 0) + .add((itemFrame.getLocation().getDirection().normalize()) + ) + ); + this.hologram.setPageContent(List.of( + r -> LanguageManager.getINSTANCE().getMsg(r, FixWiringProvider.PANEL_HOLO) + )); + this.hologram.hideToAll(); + } } public ItemFrame getItemFrame() { @@ -95,28 +103,28 @@ public void startFixingPanel(Player player, FixWiringTask fixWiring) { }).execute(); } - public void startGlowing(UUID player){ + public void startGlowing(UUID player) { Player player1 = Bukkit.getPlayer(player); if (player1 == null) return; GlowingManager.setGlowingGreen(getItemFrame(), player1); if (hologram != null) { - hologram.show(player1); + hologram.showToPlayer(player1); } } - public void startGlowing(Player player){ + public void startGlowing(Player player) { GlowingManager.setGlowingGreen(getItemFrame(), player); if (hologram != null) { - hologram.show(player); + hologram.showToPlayer(player); } } - public void stopGlowing(UUID player){ + public void stopGlowing(UUID player) { Player player1 = Bukkit.getPlayer(player); if (player1 == null) return; GlowingManager.getInstance().removeGlowing(getItemFrame(), player1); if (hologram != null) { - hologram.hide(player1); + hologram.showToPlayer(player1); } } @@ -124,14 +132,14 @@ public void increaseAssignments() { assignments++; } - public Hologram getHologram() { + public @Nullable HologramI getHologram() { return hologram; } public void stopGlowing(Player player) { GlowingManager.getInstance().removeGlowing(getItemFrame(), player); if (hologram != null) { - hologram.hide(player); + hologram.showToPlayer(player); } } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/listener/PlayerMoveListener.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/listener/PlayerMoveListener.java index ee95c55c..1683446e 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/listener/PlayerMoveListener.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/listener/PlayerMoveListener.java @@ -47,12 +47,12 @@ public void onMove(PlayerMoveEvent event) { if (corpse.isInRange(location)) { if (corpse.getHologram().isHiddenFor(player)) { if (playerTeam != null && playerTeam.canReportBody()) { - corpse.getHologram().show(player); + corpse.getHologram().showToPlayer(player); } } } else { if (!corpse.getHologram().isHiddenFor(player)) { - corpse.getHologram().hide(player); + corpse.getHologram().hideFromPlayer(player); } } } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/sabotage/oxygen/OxygenSabotage.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/sabotage/oxygen/OxygenSabotage.java index a1975bea..a0488ea2 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/sabotage/oxygen/OxygenSabotage.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/arena/sabotage/oxygen/OxygenSabotage.java @@ -1,8 +1,5 @@ package com.andrei1058.stevesus.arena.sabotage.oxygen; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.GameListener; @@ -13,6 +10,8 @@ import com.andrei1058.stevesus.api.event.GameSabotageDeactivateEvent; import com.andrei1058.stevesus.api.glow.GlowColor; import com.andrei1058.stevesus.api.glow.GlowingBox; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.common.gui.ItemUtil; import com.andrei1058.stevesus.language.LanguageManager; @@ -137,17 +136,20 @@ public class OxygenMonitor { private byte nextErrorFace = -1; private byte nextPulseFace = -1; private boolean fixed = true; - private final Hologram hologram; + private @Nullable HologramI hologram; private final GlowingBox glowingBox; - public OxygenMonitor(Location location) { + public OxygenMonitor(@NotNull Location location) { // try to create error state hologram - hologram = new Hologram(location.clone().add(0, 2, 0).add(location.getDirection()), 1); - hologram.allowCollisions(false); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, OxygenSabotageProvider.TO_FIX_HOLOGRAM))); - hologram.hide(); + hologram = HologramManager.getInstance().makeUnsafe( + location.clone().add(0, 2, 0).add(location.getDirection()), + List.of( + r-> LanguageManager.getINSTANCE().getMsg(r, OxygenSabotageProvider.TO_FIX_HOLOGRAM) + ) + ); + if (null != hologram) { + hologram.hideToAll(); + } glowingBox = new GlowingBox(location.clone().add(0, 1.5, 0), 1, GlowColor.RED); @@ -180,8 +182,11 @@ public OxygenMonitor(Location location) { } public void startError() { - hologram.show(); - hologram.refreshLines(); + if (null != hologram) { + // fixme show to all +// hologram.show(); + hologram.refreshForAll(); + } fixed = false; for (Player player : getArena().getPlayers()) { getGlowingBox().startGlowing(player); @@ -207,7 +212,9 @@ public void onErrorFix(boolean meeting) { if (!meeting) { tryDeactivate(); } - hologram.hide(); + if (null != hologram) { + hologram.remove(); + } for (Player player : getArena().getPlayers()) { getGlowingBox().stopGlowing(player); } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/hook/corpse/CorpseManager.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/hook/corpse/CorpseManager.java index ad2dcab0..2e184686 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/hook/corpse/CorpseManager.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/hook/corpse/CorpseManager.java @@ -1,12 +1,11 @@ package com.andrei1058.stevesus.hook.corpse; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.Arena; import com.andrei1058.stevesus.api.arena.PlayerCorpse; import com.andrei1058.stevesus.api.arena.team.Team; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.locale.Message; import com.andrei1058.stevesus.api.arena.room.CircleRegion; import com.andrei1058.stevesus.api.arena.room.Region; @@ -19,6 +18,7 @@ import org.golde.bukkit.corpsereborn.nms.Corpses; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.UUID; public class CorpseManager { @@ -40,24 +40,28 @@ public static class CorpseRebornBody implements PlayerCorpse { private final Corpses.CorpseData data; private final Player owner; - private final Hologram hologram; + private @Nullable HologramI hologram = null; private final Region region; public CorpseRebornBody(Arena arena, Player player, Location location, ItemStack helmet, ItemStack chestPlate, ItemStack leggings, ItemStack boots) { owner = player; this.region = new CircleRegion(location, 3, false); data = CorpseAPI.spawnCorpse(player, location, new ItemStack[]{}, helmet, chestPlate, leggings, boots); - hologram = new Hologram(location, 2); - HologramPage page = hologram.getPage(0); - assert page != null; - page.setLineContent(0, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.DEAD_BODY_HOLO_LINE1))); - page.setLineContent(1, new LineTextContent(s -> LanguageManager.getINSTANCE().getMsg(s, Message.DEAD_BODY_HOLO_LINE2))); + + var holoManager = HologramManager.getInstance().getProvider(); + if (null != holoManager) { + hologram = holoManager.spawnHologram(location); + hologram.setPageContent(Arrays.asList( + r -> LanguageManager.getINSTANCE().getMsg(r, Message.DEAD_BODY_HOLO_LINE1), + r -> LanguageManager.getINSTANCE().getMsg(r, Message.DEAD_BODY_HOLO_LINE2) + )); + } arena.getPlayers().forEach(inGame -> { Team playerTeam = arena.getPlayerTeam(inGame); if (isInRange(inGame.getLocation()) && playerTeam.canReportBody()) { - hologram.show(inGame); + hologram.showToPlayer(inGame); } else { - hologram.hide(inGame); + hologram.hideFromPlayer(inGame); } }); } @@ -69,8 +73,9 @@ public Corpses.CorpseData getData() { @Override public void destroy() { CorpseAPI.removeCorpse(data); - hologram.hide(); - //todo destroy hologram + if (null != hologram) { + hologram.remove(); + } } @Override @@ -94,7 +99,7 @@ public UUID getOwner() { } @Override - public @Nullable Hologram getHologram() { + public @Nullable HologramI getHologram() { return hologram; } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/server/ServerManager.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/server/ServerManager.java index bcfb996d..a5e591ec 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/server/ServerManager.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/server/ServerManager.java @@ -2,10 +2,10 @@ import ch.jalu.configme.SettingsManager; import ch.jalu.configme.SettingsManagerBuilder; -import com.andrei1058.hologramapi.HologramAPI; import com.andrei1058.spigot.versionsupport.ParticleSupport; import com.andrei1058.spigot.versionsupport.PlayerNPCSupport; import com.andrei1058.stevesus.SteveSus; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.server.DisconnectHandler; import com.andrei1058.stevesus.api.server.ServerType; import com.andrei1058.stevesus.arena.listener.*; @@ -46,7 +46,6 @@ public class ServerManager { private DisconnectHandler disconnectHandler; private boolean debuggingLogs = true; private final String serverName; - private HologramAPI hologramAPI; private PlayerNPCSupport playerNPCSupport; private static ParticleSupport particleSupport; @@ -64,6 +63,9 @@ public static void onLoad() { if (INSTANCE == null) { INSTANCE = new ServerManager(); } + + // register hologram api + HologramManager.getInstance().onLoad(SteveSus.getInstance()); } @SuppressWarnings("InstantiationOfUtilityClass") @@ -72,11 +74,7 @@ public static void onEnable() { INSTANCE.config.reload(); // register hologram api - try { - INSTANCE.hologramAPI = new HologramAPI(SteveSus.getInstance()); - } catch (InstantiationException e) { - e.printStackTrace(); - } + HologramManager.getInstance().onEnable(SteveSus.getInstance()); particleSupport = ParticleSupport.SupportBuilder.load(); @@ -156,6 +154,8 @@ public static void onDisable() { RemoteLobby.getSockets().values().forEach(RemoteLobby::close); SteveSus.debug("Took " + (System.currentTimeMillis() - startTime) + "ms to disable " + ServerManager.class.getSimpleName() + "."); } + // clear hologram api + HologramManager.getInstance().onDisable(SteveSus.getInstance()); } public SettingsManager getConfig() { @@ -191,10 +191,6 @@ public String getServerName() { return serverName; } - public HologramAPI getHologramAPI() { - return hologramAPI; - } - public PlayerNPCSupport getPlayerNPCSupport() { return playerNPCSupport; } diff --git a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/setup/SetupActivity.java b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/setup/SetupActivity.java index 93cff0e7..00330c90 100644 --- a/stevesus-plugin/src/main/java/com/andrei1058/stevesus/setup/SetupActivity.java +++ b/stevesus-plugin/src/main/java/com/andrei1058/stevesus/setup/SetupActivity.java @@ -1,11 +1,10 @@ package com.andrei1058.stevesus.setup; import ch.jalu.configme.SettingsManager; -import com.andrei1058.hologramapi.Hologram; -import com.andrei1058.hologramapi.HologramPage; -import com.andrei1058.hologramapi.content.LineTextContent; import com.andrei1058.stevesus.SteveSus; import com.andrei1058.stevesus.api.arena.ArenaTime; +import com.andrei1058.stevesus.api.hook.hologram.HologramI; +import com.andrei1058.stevesus.api.hook.hologram.HologramManager; import com.andrei1058.stevesus.api.server.ServerType; import com.andrei1058.stevesus.api.setup.SetupListener; import com.andrei1058.stevesus.api.setup.SetupSession; @@ -23,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; @@ -32,7 +32,7 @@ public class SetupActivity implements SetupSession { private final Player player; private final String worldName; private SettingsManager config; - private Hologram meetingButtonHologram; + private @Nullable HologramI meetingButtonHologram; private BukkitTask setupTask; private boolean allowCommands = true; private final LinkedHashMap cachedValues = new LinkedHashMap<>(); @@ -105,7 +105,6 @@ public void onStart(World world) { public void onStop() { setupTask.cancel(); if (meetingButtonHologram != null) { - meetingButtonHologram.hide(); meetingButtonHologram.remove(); } if (player.isOnline()) { @@ -166,27 +165,28 @@ public Collection getSetupListeners() { public void reloadButtonHologram() { config.reload(); if (!config.getProperty(ArenaConfig.MEETING_BUTTON_LOC).isPresent()) return; - HologramPage page; if (meetingButtonHologram != null) { - meetingButtonHologram.hide(); meetingButtonHologram.remove(); } // the first page is created automatically Location location = config.getProperty(ArenaConfig.MEETING_BUTTON_LOC).get(); location.setWorld(player.getWorld()); - meetingButtonHologram = new Hologram(location.clone().add(0, 1.3, 0), 2); - page = meetingButtonHologram.getPage(0); - // setting first line content - assert page != null; - page.setLineContent(0, new LineTextContent((p) -> "&4&lEmergency Meeting Button")); - page.setLineContent(1, new LineTextContent((p) -> "&fwill be spawned here")); + meetingButtonHologram = HologramManager.getInstance().makeUnsafe( + location.clone().add(0, 1.3, 0), + Arrays.asList( + r -> "&4&lEmergency Meeting Button", + r -> "&fwill be spawned here" + ) + ); SteveSus.newChain().delay(10).sync(()-> { - meetingButtonHologram.hide(player); - meetingButtonHologram.show(player); + if (null != meetingButtonHologram) { + meetingButtonHologram.hideFromPlayer(player); + meetingButtonHologram.showToPlayer(player); + } }).execute(); } - public void setTime(ArenaTime time) { + public void setTime(@NotNull ArenaTime time) { this.time = time; Bukkit.getWorld(getWorldName()).setTime(time.getStartTick()); } diff --git a/stevesus-plugin/src/main/resources/plugin.yml b/stevesus-plugin/src/main/resources/plugin.yml index f831cdd5..4d34c464 100644 --- a/stevesus-plugin/src/main/resources/plugin.yml +++ b/stevesus-plugin/src/main/resources/plugin.yml @@ -11,4 +11,5 @@ softdepend: - CorpseReborn - GlowAPI - PacketListenerAPI + - packetevents main: com.andrei1058.stevesus.SteveSus \ No newline at end of file