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: