ViewerListener
unknown
java
a year ago
3.6 kB
12
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