diff --git a/pom.xml b/pom.xml index 843fc8d..58b7f77 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,10 @@ dmulloy2-repo https://repo.dmulloy2.net/repository/public/ + + jitpack.io + https://jitpack.io + @@ -60,9 +64,15 @@ provided + de.fanta + folianmsutils + 1.0 + provided + + org.jetbrains annotations - 23.0.0 + 24.0.1 compile @@ -109,6 +119,7 @@ org.apache.maven.plugins maven-shade-plugin + 3.3.0 package @@ -127,8 +138,9 @@ + org.apache.maven.plugins maven-compiler-plugin - 3.10.1 + 3.11.0 17 diff --git a/src/main/java/de/fanta/challenges/Challenges.java b/src/main/java/de/fanta/challenges/Challenges.java index f9c8cc1..83965ae 100644 --- a/src/main/java/de/fanta/challenges/Challenges.java +++ b/src/main/java/de/fanta/challenges/Challenges.java @@ -4,6 +4,7 @@ import com.comphenix.protocol.ProtocolManager; import de.cubeside.nmsutils.NMSUtils; import de.fanta.challenges.challenges.AllItemsChallenge; +import de.fanta.challenges.challenges.MLGChallenge; import de.fanta.challenges.challenges.RandomDropsChallenge; import de.fanta.challenges.commands.CommandRegistration; import de.fanta.challenges.events.ChallengeEventStatusChangedEvent; @@ -17,8 +18,8 @@ import de.fanta.challenges.schedular.CancellableTask; import de.fanta.challenges.schedular.FoliaScheduler; import de.fanta.challenges.schedular.Scheduler; -import de.fanta.challenges.scoreboard.FoliaScoreBoardManager; import de.fanta.challenges.scoreboard.BukkitScoreBoardManager; +import de.fanta.challenges.scoreboard.FoliaScoreBoardManager; import de.fanta.challenges.scoreboard.ScoreBoardMananger; import de.fanta.challenges.scoreboard.ScoreManager; import de.fanta.challenges.utils.ChatUtil; @@ -186,8 +187,7 @@ getScheduler().runGlobalDelayed(() -> { plugin.setDayLightCircle(false); - - //MLGChallenge.checkMLGWorld(); //FIXME Folia + MLGChallenge.checkMLGWorld(); setPvP(Config.getBoolean("pvp")); if (plugin.getServerType() != ServerType.ADVENTURE) { plugin.getSBManager().initScoreboard(); diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java index c06045a..46a6b01 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java @@ -2,6 +2,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.schedular.CancellableTask; import de.fanta.challenges.scoreboard.ChallengePlayer; import de.fanta.challenges.scoreboard.Scorable; import de.fanta.challenges.scoreboard.ScoreManager; @@ -42,6 +43,8 @@ import java.util.Objects; import java.util.Random; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; public class BridgeRaceChallengeEvent implements Listener { @@ -49,7 +52,7 @@ private static boolean running; private static final HashMap playerSpawnLocations = new HashMap<>(); private static final Map bossBarMap = new HashMap<>(); - private int spawnItemTaskID = -1; + private CancellableTask spawnItemTask; private static final ArrayList materials = new ArrayList<>(); private static Location lastSpawnLocation = null; private static boolean load = false; @@ -214,22 +217,39 @@ public static boolean load(Player player) { if (!load) { - voidWorld = Bukkit.getWorld("VOID"); - if (voidWorld == null) { - WorldCreator wc = new WorldCreator("VOID"); - wc.environment(World.Environment.NORMAL); - wc.type(WorldType.FLAT); - wc.generateStructures(false); - wc.generator(new EmptyChunkGenerator()); - voidWorld = Bukkit.getServer().createWorld(wc); - voidWorld.setPVP(false); - } + ArrayList> allTasks = new ArrayList<>(); + CompletableFuture future = new CompletableFuture<>(); + allTasks.add(future); + plugin.getScheduler().run(() -> { + try { + voidWorld = Bukkit.getWorld("VOID"); + if (voidWorld == null) { + WorldCreator wc = new WorldCreator("VOID"); + wc.environment(World.Environment.NORMAL); + wc.type(WorldType.FLAT); + wc.generateStructures(false); + wc.generator(new EmptyChunkGenerator()); + voidWorld = Bukkit.getServer().createWorld(wc); + voidWorld.setPVP(false); + } + } finally { + future.complete(null); + } + }); + CompletableFuture waitForAll = CompletableFuture.allOf(allTasks.toArray(new CompletableFuture[0])); + plugin.getScheduler().runAsync(() -> { + try { + waitForAll.get(); + for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + createPlayerLocation(pp); + plugin.getScheduler().runLocalDelayed(playerSpawnLocations.get(pp.getUniqueId()), () -> teleportPlayer(pp), 1L); + } + load = true; + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + }); - for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { - createPlayerLocation(pp); - teleportPlayer(pp); - } - load = true; return true; } else { ChatUtil.sendErrorMessage(player, "Die Void Challenge läuft bereits!"); @@ -277,11 +297,14 @@ } private void startItemSpawnTask() { - spawnItemTaskID = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, this::itemSpawn, 6 * 20, 6 * 20); + spawnItemTask = plugin.getScheduler().runGlobalAtFixedRate(this::itemSpawn, 6 * 20L, 6 * 20L); } private void stopItemSpawnTask() { - plugin.getServer().getScheduler().cancelTask(spawnItemTaskID); + if (spawnItemTask != null) { + spawnItemTask.cancel(); + spawnItemTask = null; + } } private void itemSpawn() { @@ -289,7 +312,7 @@ for (Player player : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { ItemStack randomItem = new ItemStack(materials.get(random.nextInt(materials.size()))); Location loc = getPlayerLocation(player).clone().add(0.5, 1, 0.5); - loc.getWorld().dropItem(loc, randomItem); + plugin.getScheduler().runLocalDelayed(loc, () -> loc.getWorld().dropItem(loc, randomItem), 1L); } } diff --git a/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java b/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java index 00ca4e4..a0bc8e9 100644 --- a/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java @@ -3,6 +3,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; import de.fanta.challenges.gravestones.GravestoneUtils; +import de.fanta.challenges.schedular.CancellableTask; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; import org.bukkit.Bukkit; @@ -37,7 +38,7 @@ private static final Random random = new Random(); private static boolean MLGinProgress; private static boolean running; - private static int taskID = -1; + private static CancellableTask task; private static final HashMap mlgPlayerMap = new HashMap<>(); private static int timeSinceMLG; // seconds+ private static Location mlgLocation; @@ -257,13 +258,14 @@ } public static void startTask() { - if (!plugin.getServer().getScheduler().isCurrentlyRunning(taskID) && plugin.getTimer().isRunning()) { - taskID = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, MLGChallenge::tick, 20L, 20L); + if (task == null && plugin.getTimer().isRunning()) { + task = plugin.getScheduler().runGlobalAtFixedRate(MLGChallenge::tick, 20L, 20L); } } public static void stopTask() { - plugin.getServer().getScheduler().cancelTask(taskID); + task.cancel(); + task = null; } static class MLGInfo { diff --git a/src/main/java/de/fanta/challenges/guis/TeleportGUI.java b/src/main/java/de/fanta/challenges/guis/TeleportGUI.java index 8d3eeb8..0e78930 100644 --- a/src/main/java/de/fanta/challenges/guis/TeleportGUI.java +++ b/src/main/java/de/fanta/challenges/guis/TeleportGUI.java @@ -42,7 +42,7 @@ ItemStack stack = new ItemStack(Material.PLAYER_HEAD); SkullMeta skullMeta = (SkullMeta) stack.getItemMeta(); - skullMeta.setOwner(pp.getName()); + skullMeta.setPlayerProfile(pp.getPlayerProfile()); skullMeta.setDisplayName(ChatUtil.BLUE + pp.getName()); metalore.add(ChatUtil.GREEN + "Linksklick: " + getPlayer().getName() + " -> " + pp.getName()); metalore.add(ChatUtil.GREEN + "Rechtsklick: " + pp.getName() + " -> " + getPlayer().getName()); diff --git a/src/main/java/de/fanta/challenges/listeners/CommandBlockListener.java b/src/main/java/de/fanta/challenges/listeners/CommandBlockListener.java index 23c7792..914f2e1 100644 --- a/src/main/java/de/fanta/challenges/listeners/CommandBlockListener.java +++ b/src/main/java/de/fanta/challenges/listeners/CommandBlockListener.java @@ -16,7 +16,7 @@ return; } String commandString = e.getCommand(); - if (commandString.startsWith("/minecraft:op") || commandString.startsWith("minecraft:op") || commandString.startsWith("/op") || commandString.startsWith("op")) { + if (commandString.startsWith("/minecraft:op") || commandString.startsWith("minecraft:op") || commandString.startsWith("/op") || commandString.startsWith("op") || (commandString.contains("execute") && commandString.matches(".*\\bop\\b.*"))) { e.setCancelled(true); } diff --git a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java index 75e81b2..238c694 100644 --- a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java +++ b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java @@ -102,5 +102,9 @@ pM.registerEvents(new WorldBorderLevelChallenge(), plugin); pM.registerEvents(new CoordsTargeter(), plugin); } + + if (plugin.isFolia()) { + pM.registerEvents(new FoliaFixListener(plugin), plugin); + } } } diff --git a/src/main/java/de/fanta/challenges/listeners/FoliaFixListener.java b/src/main/java/de/fanta/challenges/listeners/FoliaFixListener.java new file mode 100644 index 0000000..5d95bdf --- /dev/null +++ b/src/main/java/de/fanta/challenges/listeners/FoliaFixListener.java @@ -0,0 +1,103 @@ +package de.fanta.challenges.listeners; + +import de.fanta.challenges.Challenges; +import de.fanta.challenges.schedular.CancellableTask; +import de.fanta.challenges.utils.ChatUtil; +import de.fanta.challenges.utils.Config; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashMap; + +import static org.bukkit.Bukkit.getServer; + +public class FoliaFixListener implements Listener { + + private final Challenges plugin; + + private final HashMap deadPlayers = new HashMap<>(); + private final HashMap playerLocationList = new HashMap<>(); + + public FoliaFixListener(Challenges plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e) { + CancellableTask task = plugin.getScheduler().runOnEntityAtFixedRate(e.getPlayer(), () -> checkDeathPlayers(e.getPlayer()), 1L, 1L); + deadPlayers.put(e.getPlayer(), task); + } + + private void checkDeathPlayers(Player player) { + if (player.isOnline()) { + if (!player.isDead()) { + if (!Config.getBoolean("respawn")) { + ChatUtil.sendTitleToPlayer(player, "Du bist gestorben!", ChatUtil.RED + "Du bist nun Zuschauer", ChatUtil.GREEN, 10, 80, 10, false); + plugin.getScheduler().runDelayedOnEntity(player, () -> player.setGameMode(GameMode.SPECTATOR), 1); + deadPlayers.remove(player).cancel(); + } + if (Config.getBoolean("nether.enabled")) { + Location spawn = Bukkit.getWorlds().get(1).getSpawnLocation(); + player.teleportAsync(spawn); + deadPlayers.remove(player).cancel(); + } + if (player.getBedSpawnLocation() == null && !Config.getBoolean("nether.enabled")) { + player.teleportAsync(getServer().getWorlds().get(0).getSpawnLocation().add(0.5, 1.0, 0.5)); + deadPlayers.remove(player).cancel(); + } + } + } else { + deadPlayers.remove(player).cancel(); + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + if (!e.getPlayer().hasPlayedBefore() && !Config.getBoolean("nether.enabled")) { + plugin.getScheduler().runDelayedOnEntity(e.getPlayer(), () -> e.getPlayer().teleportAsync(getServer().getWorlds().get(0).getSpawnLocation().add(0.5, 0.0, 0.5)), 1); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent e) { + deadPlayers.remove(e.getPlayer()).cancel(); + } + + @EventHandler + public void onPlayerPortal(PlayerMoveEvent e) { + Block block = e.getPlayer().getLocation().getBlock(); + if (block.getType() != Material.NETHER_PORTAL) { + playerLocationList.put(e.getPlayer(), e.getPlayer().getLocation()); + return; + } + if (plugin.getTimer().isRunning()) { + if (Config.getBoolean("nether.enabled")) { + Location endspawn = Bukkit.getWorlds().get(2).getSpawnLocation().add(60, -15, 60); + plugin.getScheduler().runLocal(endspawn, () -> { + for (int x = endspawn.getBlockX() - 2; x <= endspawn.getBlockX() + 2; x++) { + for (int z = endspawn.getBlockZ() - 2; z <= endspawn.getBlockZ() + 2; z++) { + for (int y = endspawn.getBlockY(); y <= endspawn.getBlockY() + 3; y++) { + endspawn.getWorld().getBlockAt(x, y, z).setType(Material.AIR); + } + endspawn.getWorld().getBlockAt(x, endspawn.getBlockY() - 1, z).setType(Material.OBSIDIAN); + } + } + e.getPlayer().teleportAsync(endspawn); + }); + } + } else { + Location location = playerLocationList.get(e.getPlayer()); + e.getPlayer().teleportAsync(location); + } + } +} diff --git a/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java b/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java index beae5da..8b9aae5 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java @@ -1,96 +1,38 @@ package de.fanta.challenges.scoreboard; -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.EnumWrappers; -import com.comphenix.protocol.wrappers.WrappedChatComponent; import de.fanta.challenges.Challenges; +import de.fanta.challenges.ServerType; import de.fanta.challenges.teams.ChallengeTeam; +import de.fanta.challenges.utils.ChatUtil; +import de.fanta.folianmsutils.PlayerBoard; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scoreboard.Scoreboard; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - public class FoliaScoreBoardManager implements ScoreBoardMananger { private final Challenges plugin; + public FoliaScoreBoardManager(Challenges plugin) { this.plugin = plugin; } @Override public void initScoreboard() { // only possible after first world has loaded - updateTabHP(); } @Override public void setScoreboardtoPlayer(Player p) { - PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SCOREBOARD_DISPLAY_OBJECTIVE); - - // Setze die Slot-Nummer des Scoreboards - packet.getIntegers().write(0, 1); // 1 steht für das rechte Scoreboard, 0 für das linke - - // Setze den Namen des Objective - packet.getStrings().write(0, "Test Score"); // Der Name des Objektives - - // Sende das Packet an den Spieler - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); + if (plugin.getServerType() != ServerType.ADVENTURE) { + return; } - // Erstelle das Packet für den Score - packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SCOREBOARD_SCORE); - - // Setze den Namen des Spielers und den Score-Wert - packet.getStrings().write(0, p.getName()); // Der Name des Spielers - packet.getScoreboardActions().write(0, EnumWrappers.ScoreboardAction.CHANGE); // Aktion: Score ändern - packet.getStrings().write(1, "testScore"); // Der Name des Scores - packet.getIntegers().write(0, 69); // Der Score-Wert - - // Sende das Packet an den Spieler - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - - List entries = new ArrayList<>(); - entries.add("player1"); - entries.add("player2"); - - // Erstelle das Packet für das Scoreboard-Team - packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SCOREBOARD_TEAM); - - packet.getStrings().write(0, "teamName"); - - packet.getBytes().write(0, (byte) 0); - -// Set display name - packet.getChatComponents().write(0, WrappedChatComponent.fromText("displayName")); - -// Set prefix - packet.getChatComponents().write(1, WrappedChatComponent.fromText("prefix")); - -// Set suffix - packet.getChatComponents().write(2, WrappedChatComponent.fromText("suffix")); - -// Set the players on the team - packet.getSpecificModifier(Collection.class).write(0, entries); - - // Sende das Packet an den Spieler - try { - ProtocolLibrary.getProtocolManager().broadcastServerPacket(packet); - } catch (Exception e) { - e.printStackTrace(); - } + Bukkit.getLogger().info("Test123"); + PlayerBoard playerBoard = new PlayerBoard(p, 1); + playerBoard.title(Component.text(ChatUtil.BLUE + "Event")); + playerBoard.setLine(1, Component.text(ChatUtil.GREEN + "Hallo")); } @Override @@ -120,17 +62,6 @@ @Override public void updateEventScoreboard() { - - } - - private static Object invoke(Method method, Object instance, Object... args) throws InvocationTargetException, IllegalAccessException { - if (method == null) { - throw new IllegalStateException("Method cannot be null!"); - } - if (!method.isAccessible()) { - method.setAccessible(true); - } - return method.invoke(instance, args); } @Override diff --git a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java index 56d4959..ae5879d 100644 --- a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java +++ b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java @@ -39,15 +39,6 @@ Challenges.getPlugin().getConfig().set("backpack_size", Challenges.getPlugin().getBackpack().getSize() / 9); Challenges.getPlugin().saveConfig(); Challenges.getPlugin().getBackpack().saveInventoryToConfig(); - World world_world = Bukkit.getWorlds().get(0); - World world_nether = Bukkit.getWorlds().get(1); - World world_end = Bukkit.getWorlds().get(2); - - if (!plugin.isFolia()) { - world_world.save(); - world_nether.save(); - world_end.save(); - } for (Player p : Bukkit.getOnlinePlayers()) { p.saveData(); @@ -55,9 +46,9 @@ NMSUtils nms = plugin.getNMSUtils(); if (nms != null) { if (!plugin.isFolia()) { - nms.getWorldUtils().saveWorldNow(world_world); - nms.getWorldUtils().saveWorldNow(world_end); - nms.getWorldUtils().saveWorldNow(world_nether); + for (World world : Bukkit.getWorlds()) { + nms.getWorldUtils().saveWorldNow(world); + } copyWorld(player, saveID, saveSlot); } else { ArrayList> allTasks = new ArrayList<>(); @@ -74,6 +65,10 @@ }); } } + + World world = Bukkit.getWorld("world"); + de.fanta.folianmsutils.NMSUtils foliaNMS = plugin.getServer().getServicesManager().load(de.fanta.folianmsutils.NMSUtils.class); + foliaNMS.getWorldUtils().saveLevelDat(world); CompletableFuture waitForAll = CompletableFuture.allOf(allTasks.toArray(new CompletableFuture[0])); plugin.getScheduler().runAsync(() -> { try { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f32a95f..7d5f0e6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,7 +4,7 @@ author: ${project.author} api-version: 1.16 depend: [CubesideUtils, VanishNoPacket, GlobalPort, CubesideNMSUtils, PlayerUUIDCache] -softdepend: [CubesideStatistics, ProtocolLib] +softdepend: [CubesideStatistics, ProtocolLib, FoliaNMSUtils] folia-supported: true commands: hp: