ViewerListener
unknown
java
a year ago
3.6 kB
7
Indexable
package gg.bundlegroup.screen.listeners; import gg.bundlegroup.screen.*; import gg.bundlegroup.screen.managers.ScreenManager; import gg.bundlegroup.screen.models.Frame; import gg.bundlegroup.screen.models.Screen; import gg.bundlegroup.screen.models.ScreenMap; import io.papermc.paper.event.player.PlayerTrackEntityEvent; import io.papermc.paper.event.player.PlayerUntrackEntityEvent; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.map.MapPalette; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; import java.util.HashMap; import java.util.Map; public class ViewerListener implements Listener { private final Map<Integer, Frame> frames = new HashMap<>(); private final Plugin plugin; private final ScreenManager screenManager; private final ScreenMap fallback; @SuppressWarnings("deprecation") public ViewerListener(Plugin plugin, ScreenManager screenManager) { this.plugin = plugin; this.screenManager = screenManager; this.fallback = screenManager.createMap(); for (int x = 0; x < 128; x++) { for (int y = 0; y < 128; y++) { fallback.setPixel(x, y, MapPalette.RED); } } } @EventHandler public void onTrack(PlayerTrackEntityEvent event) { if (!(event.getEntity() instanceof ItemFrame itemFrame)) { return; } ScreenMap map = getMap(itemFrame); if (map == null) { return; } Frame frame = frames.computeIfAbsent(itemFrame.getEntityId(), Frame::new); frame.setMap(map); frame.addViewer(event.getPlayer()); } @EventHandler public void onUntrack(PlayerUntrackEntityEvent event) { if (!(event.getEntity() instanceof ItemFrame itemFrame)) { return; } Frame frame = frames.get(itemFrame.getEntityId()); if (frame == null) { return; } frame.removeViewer(event.getPlayer()); } @EventHandler public void onQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); for (Frame frame : frames.values()) { frame.removeViewer(player); } int count = screenManager.deleteViewer(player) + fallback.deleteViewer(player); if (count > 0) { plugin.getLogger().warning(player.getName() + " was still viewing " + count + " maps"); } } private ScreenMap getMap(ItemFrame itemFrame) { PersistentDataContainer container = itemFrame.getPersistentDataContainer(); PersistentDataContainer screenContainer = container.get(PluginConstants.SCREEN_KEY, PersistentDataType.TAG_CONTAINER); if (screenContainer == null) { return null; } String screenName = screenContainer.get(PluginConstants.NAME_KEY, PersistentDataType.STRING); if (screenName == null) { return null; } Screen screen = screenManager.getScreen(screenName); if (screen == null) { return fallback; } Integer x = screenContainer.get(PluginConstants.X_KEY, PersistentDataType.INTEGER); if (x == null) { return fallback; } Integer y = screenContainer.get(PluginConstants.Y_KEY, PersistentDataType.INTEGER); if (y == null) { return fallback; } return screen.getMap(x, y); } }
Editor is loading...
Leave a Comment