// Path: hook/manager/src/main/java/net/novucs/ftop/PluginService.java
// public interface PluginService {
// 
//     /**
//      * Initializes the service.
//      */
//     void initialize();
// 
//     /**
//      * Terminates the service.
//      */
//     void terminate();
// 
// }
// 
// Path: hook/manager/src/main/java/net/novucs/ftop/entity/ChunkPos.java
// public class ChunkPos {
// 
//     private final String world;
//     private final int x;
//     private final int z;
// 
//     public static ChunkPos of(Chunk chunk) {
//         return new ChunkPos(chunk.getWorld().getName(), chunk.getX(), chunk.getZ());
//     }
// 
//     public static ChunkPos of(ChunkSnapshot snapshot) {
//         return new ChunkPos(snapshot.getWorldName(), snapshot.getX(), snapshot.getZ());
//     }
// 
//     public static ChunkPos of(String world, int x, int z) {
//         return new ChunkPos(world, x, z);
//     }
// 
//     private ChunkPos(String world, int x, int z) {
//         this.world = world;
//         this.x = x;
//         this.z = z;
//     }
// 
//     public String getWorld() {
//         return world;
//     }
// 
//     public int getX() {
//         return x;
//     }
// 
//     public int getZ() {
//         return z;
//     }
// 
//     public Chunk getChunk(Server server) {
//         if (server.getWorld(world) == null) return null;
//         return server.getWorld(world).getChunkAt(x, z);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         ChunkPos chunkPos = (ChunkPos) o;
//         return x == chunkPos.x &&
//                 z == chunkPos.z &&
//                 Objects.equals(world, chunkPos.world);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(world, x, z);
//     }
// 
//     @Override
//     public String toString() {
//         return "ChunkPos{" +
//                 "world='" + world + '\'' +
//                 ", x=" + x +
//                 ", z=" + z +
//                 '}';
//     }
// }


import net.novucs.ftop.PluginService;
import net.novucs.ftop.entity.ChunkPos;
import org.bukkit.ChatColor;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import java.util.List;
import java.util.Set;
import java.util.UUID;
package net.novucs.ftop.hook;



public abstract class FactionsHook implements Listener, PluginService {

    private final Plugin plugin;

    public FactionsHook(Plugin plugin) {
        this.plugin = plugin;
    }

    public Plugin getPlugin() {
        return plugin;
    }

    @Override
    public void initialize() {
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
    }

    @Override
    public void terminate() {
        HandlerList.unregisterAll(this);
    }

// Path: hook/manager/src/main/java/net/novucs/ftop/PluginService.java
// public interface PluginService {
// 
//     /**
//      * Initializes the service.
//      */
//     void initialize();
// 
//     /**
//      * Terminates the service.
//      */
//     void terminate();
// 
// }
// 
// Path: hook/manager/src/main/java/net/novucs/ftop/entity/ChunkPos.java
// public class ChunkPos {
// 
//     private final String world;
//     private final int x;
//     private final int z;
// 
//     public static ChunkPos of(Chunk chunk) {
//         return new ChunkPos(chunk.getWorld().getName(), chunk.getX(), chunk.getZ());
//     }
// 
//     public static ChunkPos of(ChunkSnapshot snapshot) {
//         return new ChunkPos(snapshot.getWorldName(), snapshot.getX(), snapshot.getZ());
//     }
// 
//     public static ChunkPos of(String world, int x, int z) {
//         return new ChunkPos(world, x, z);
//     }
// 
//     private ChunkPos(String world, int x, int z) {
//         this.world = world;
//         this.x = x;
//         this.z = z;
//     }
// 
//     public String getWorld() {
//         return world;
//     }
// 
//     public int getX() {
//         return x;
//     }
// 
//     public int getZ() {
//         return z;
//     }
// 
//     public Chunk getChunk(Server server) {
//         if (server.getWorld(world) == null) return null;
//         return server.getWorld(world).getChunkAt(x, z);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         ChunkPos chunkPos = (ChunkPos) o;
//         return x == chunkPos.x &&
//                 z == chunkPos.z &&
//                 Objects.equals(world, chunkPos.world);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(world, x, z);
//     }
// 
//     @Override
//     public String toString() {
//         return "ChunkPos{" +
//                 "world='" + world + '\'' +
//                 ", x=" + x +
//                 ", z=" + z +
//                 '}';
//     }
// }


// Path: hook/manager/src/main/java/net/novucs/ftop/hook/FactionsHook.java
import net.novucs.ftop.PluginService;
import net.novucs.ftop.entity.ChunkPos;
import org.bukkit.ChatColor;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import java.util.List;
import java.util.Set;
import java.util.UUID;

package net.novucs.ftop.hook;



public abstract class FactionsHook implements Listener, PluginService {

    private final Plugin plugin;

    public FactionsHook(Plugin plugin) {
        this.plugin = plugin;
    }

    public Plugin getPlugin() {
        return plugin;
    }

    @Override
    public void initialize() {
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
    }

    @Override
    public void terminate() {
        HandlerList.unregisterAll(this);
    }

    public String getFactionAt(ChunkPos pos) {