ViewerListener

 avatar
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