package de.fanta.challengesjoinentities;
import de.cubeside.connection.GlobalServer;
import de.cubeside.connection.event.GlobalServerConnectedEvent;
import de.cubeside.connection.event.GlobalServerDisconnectedEvent;
import de.fanta.challenges.Challenges;
import de.fanta.challengesjoinentities.ChallengesGlobalDataHelper.ChallengeMessageType;
import de.iani.cubesideutils.bukkit.plugin.api.GlobalDataHelperBukkit;
import de.speedy64.globalport.GlobalApi;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.UUID;
public class ChallengesGlobalDataHelper extends GlobalDataHelperBukkit<ChallengeMessageType> implements Listener {
public static final String CHANNEL = "ChallengesJoinEntities";
private final ChallengesJoinEntities plugin;
public ChallengesGlobalDataHelper(ChallengesJoinEntities plugin) {
super(ChallengeMessageType.class, CHANNEL, plugin);
this.plugin = plugin;
}
@Override
protected void handleMessage(ChallengeMessageType challengeMessageType, GlobalServer globalServer, DataInputStream data) throws IOException {
String serverName = data.readUTF();
switch (challengeMessageType) {
case TIMER -> {
boolean running = data.readBoolean();
plugin.updateTimerStatus(serverName, running);
}
case SERVER_STATUS -> {
boolean online = data.readBoolean();
plugin.updateServerStatus(serverName, online);
}
case PLAYER_COUNT -> {
int count = data.readInt();
int maxPlayers = data.readInt();
plugin.updatePlayerCount(serverName, count, maxPlayers);
}
case INITIAL_DATA_REQUEST -> {
if (Bukkit.getPluginManager().getPlugin("Challenges") != null) {
Challenges challenges = (Challenges) Bukkit.getPluginManager().getPlugin("Challenges");
boolean timerRunning = challenges.getTimer().isRunning();
int playerCount = Bukkit.getOnlinePlayers().size();
int maxPlayers = Bukkit.getMaxPlayers();
sendInitialData(serverName, timerRunning, playerCount, maxPlayers);
}
}
case INITIAL_DATA -> {
boolean timerRunning = data.readBoolean();
int playerCount = data.readInt();
int maxPlayers = data.readInt();
plugin.updateTimerStatus(serverName, timerRunning);
plugin.updatePlayerCount(serverName, playerCount, maxPlayers);
}
default -> throw new UnsupportedOperationException();
}
}
public void sendTimerUpdate(boolean running) {
sendData(ChallengeMessageType.TIMER, getThisServerName(), running);
}
public void sendServerStatusUpdate(boolean online) {
sendData(ChallengeMessageType.SERVER_STATUS, getThisServerName(), online);
}
public void sendPlayerCountUpdate(int count) {
sendData(ChallengeMessageType.PLAYER_COUNT, getThisServerName(), count, Bukkit.getMaxPlayers());
}
public void requestInitialData(String fromServer) {
sendData(getServer(fromServer), ChallengeMessageType.INITIAL_DATA_REQUEST, getThisServerName());
}
public void sendInitialData(String toServer, boolean timerRunning, int playerCount, int maxPlayers) {
sendData(getServer(toServer), ChallengeMessageType.INITIAL_DATA, getThisServerName(), timerRunning, playerCount, maxPlayers);
}
public enum ChallengeMessageType {
TIMER, SERVER_STATUS, PLAYER_COUNT, INITIAL_DATA_REQUEST, INITIAL_DATA
}
@EventHandler
public void onGlobalServerConnected(GlobalServerConnectedEvent event) {
if (plugin.getEntityData(event.getServer().getName()) != null) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> {
plugin.updateServerStatus(event.getServer().getName(), true);
this.requestInitialData(event.getServer().getName());
}, 200L);
}
for (Server server : plugin.getPluginConfig().getChallengeServers()) {
if (server.getName().equals(event.getServer().getName())) {
UUID uuid = Server.serverPlayers.get(server);
if (uuid != null) {
Player p = Bukkit.getPlayer(uuid);
if (p != null) {
server.spawnPiglin(p);
GlobalApi.portOnlinePlayerToLocation(p.getName(), server.getGPLocation());
}
}
break;
}
}
for (Server server : plugin.getPluginConfig().getAdventureServers()) {
if (server.getName().equals(event.getServer().getName())) {
UUID uuid = Server.serverPlayers.get(server);
Player p = Bukkit.getPlayer(uuid);
if (p != null) {
server.spawnPiglin(p);
//server.spawnNPC(p);
GlobalApi.portOnlinePlayerToLocation(p.getName(), server.getGPLocation());
}
break;
}
}
}
@EventHandler
public void onGlobalServerDisconnected(GlobalServerDisconnectedEvent event) {
if (plugin.getEntityData(event.getServer().getName()) != null) {
plugin.updateServerStatus(event.getServer().getName(), false);
}
for (Server server : plugin.getPluginConfig().getChallengeServers()) {
if (server.getName().equals(event.getServer().getName())) {
server.setOnline(false);
Server.serverPlayers.remove(server);
server.despawnPiglin();
break;
}
}
for (Server server : plugin.getPluginConfig().getAdventureServers()) {
if (server.getName().equals(event.getServer().getName())) {
server.setOnline(false);
Server.serverPlayers.remove(server);
//server.despawnNPC();
server.despawnPiglin();
break;
}
}
plugin.getAvailableServers().remove(event.getServer().getName());
}
}