diff --git a/pom.xml b/pom.xml
index 96bfe42..843fc8d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,6 +23,10 @@
md5-repo
https://repo.md-5.net/content/groups/public/
+
+ dmulloy2-repo
+ https://repo.dmulloy2.net/repository/public/
+
@@ -85,6 +89,12 @@
10.0.32
provided
+
+ com.comphenix.protocol
+ ProtocolLib
+ 5.0.0-SNAPSHOT
+ provided
+
diff --git a/src/main/java/de/fanta/challenges/Challenges.java b/src/main/java/de/fanta/challenges/Challenges.java
index 5ff2815..f9c8cc1 100644
--- a/src/main/java/de/fanta/challenges/Challenges.java
+++ b/src/main/java/de/fanta/challenges/Challenges.java
@@ -1,5 +1,7 @@
package de.fanta.challenges;
+import com.comphenix.protocol.ProtocolLibrary;
+import com.comphenix.protocol.ProtocolManager;
import de.cubeside.nmsutils.NMSUtils;
import de.fanta.challenges.challenges.AllItemsChallenge;
import de.fanta.challenges.challenges.RandomDropsChallenge;
@@ -109,12 +111,19 @@
private Scheduler scheduler;
private boolean isFolia = false;
+ private ProtocolManager protocolManager;
+
public static Challenges getPlugin() {
return plugin;
}
@Override
public void onEnable() {
+ if (getServer().getPluginManager().isPluginEnabled("ProtocolLib")) {
+ protocolManager = ProtocolLibrary.getProtocolManager();
+ getLogger().log(Level.INFO, "ProtocolLib found");
+ }
+
LOGGER = getLogger();
plugin = this;
nmsUtils = getServer().getServicesManager().load(NMSUtils.class);
@@ -690,4 +699,8 @@
public boolean isFolia() {
return isFolia;
}
+
+ public ProtocolManager getProtocolManager() {
+ return protocolManager;
+ }
}
diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java
index c7b1800..6f4b488 100644
--- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java
+++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java
@@ -241,9 +241,7 @@
public void onPlayerJoin(PlayerJoinEvent e) {
if (Objects.equals(Config.getString("event.type"), "deathrun")) {
if (deadPlayer.contains(e.getPlayer().getUniqueId())) {
- if (!plugin.isFolia()) {
- e.getPlayer().setScoreboard(plugin.getSBManager().getScoreboard());
- }
+ plugin.getSBManager().setScoreboardtoPlayer(e.getPlayer());
}
}
}
diff --git a/src/main/java/de/fanta/challenges/commands/challenges/ChallengesCommand.java b/src/main/java/de/fanta/challenges/commands/challenges/ChallengesCommand.java
index e56cbaf..69dd6a7 100644
--- a/src/main/java/de/fanta/challenges/commands/challenges/ChallengesCommand.java
+++ b/src/main/java/de/fanta/challenges/commands/challenges/ChallengesCommand.java
@@ -1,11 +1,19 @@
package de.fanta.challenges.commands.challenges;
+import com.comphenix.protocol.PacketType;
+import com.comphenix.protocol.ProtocolLibrary;
+import com.comphenix.protocol.events.PacketContainer;
import de.fanta.challenges.Challenges;
import de.fanta.challenges.utils.ChatUtil;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.commands.ArgsParser;
+import org.bukkit.Sound;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.util.Vector;
+
+import java.util.ArrayList;
public class ChallengesCommand extends SubCommand {
@@ -17,8 +25,27 @@
@Override
public boolean onCommand(CommandSender sender, Command command, String alias, String commandString, ArgsParser args) {
- ChatUtil.sendNormalMessage(sender, "Challenges v" + plugin.getDescription().getVersion() + " by " + plugin.getDescription().getAuthors());
+ ChatUtil.sendNormalMessage(sender, "Challenges v" + plugin.getPluginMeta().getVersion() + " by " + (plugin.getPluginMeta().getAuthors() + "").replace("[" , "").replace("]", ""));
ChatUtil.sendNormalMessage(sender, "Nutze /challenges help für Hilfe");
+
+ if (sender instanceof Player player) {
+ PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.NAMED_SOUND_EFFECT);
+
+ // Setze den Sound-Effekt
+ packet.getSoundEffects().write(0, Sound.BLOCK_NOTE_BLOCK_PLING);
+
+ // Setze die Koordinaten des Sounds
+ packet.getIntegers().write(0, player.getLocation().getBlockX() * 8);
+ packet.getIntegers().write(1, player.getLocation().getBlockY() * 8);
+ packet.getIntegers().write(2, player.getLocation().getBlockZ() * 8);
+
+ // Setze die Lautstärke und Tonhöhe des Sounds
+ packet.getFloat().write(0, 1.0f); // Lautstärke
+ packet.getFloat().write(1, 1.0f); // Tonhöhe
+
+ ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
+ }
+
return true;
}
}
diff --git a/src/main/java/de/fanta/challenges/schedular/BukkitScheduler.java b/src/main/java/de/fanta/challenges/schedular/BukkitScheduler.java
index ea628af..c39a874 100644
--- a/src/main/java/de/fanta/challenges/schedular/BukkitScheduler.java
+++ b/src/main/java/de/fanta/challenges/schedular/BukkitScheduler.java
@@ -3,6 +3,7 @@
import de.fanta.challenges.Challenges;
import org.bukkit.Bukkit;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.entity.Entity;
import java.util.function.Consumer;
@@ -26,6 +27,16 @@
}
@Override
+ public void runLocal(Location location, Runnable task) {
+ Bukkit.getScheduler().runTask(this.plugin, task);
+ }
+
+ @Override
+ public void runAtChunk(World world, int chunkX, int chunkZ, Runnable task) {
+ Bukkit.getScheduler().runTask(this.plugin, task);
+ }
+
+ @Override
public CancellableTask runGlobalDelayed(Runnable task, long delay) {
return Bukkit.getScheduler().runTaskLater(this.plugin, task, delay)::cancel;
}
diff --git a/src/main/java/de/fanta/challenges/schedular/FoliaScheduler.java b/src/main/java/de/fanta/challenges/schedular/FoliaScheduler.java
index ae437e6..1be9b25 100644
--- a/src/main/java/de/fanta/challenges/schedular/FoliaScheduler.java
+++ b/src/main/java/de/fanta/challenges/schedular/FoliaScheduler.java
@@ -4,6 +4,7 @@
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import org.bukkit.Bukkit;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.entity.Entity;
import java.util.function.Consumer;
@@ -27,6 +28,16 @@
}
@Override
+ public void runLocal(Location location, Runnable task) {
+ Bukkit.getServer().getRegionScheduler().run(this.plugin, location, scheduledTask -> task.run());
+ }
+
+ @Override
+ public void runAtChunk(World world, int chunkX, int chunkZ, Runnable task) {
+ Bukkit.getServer().getRegionScheduler().run(this.plugin, world, chunkX, chunkZ, scheduledTask -> task.run());
+ }
+
+ @Override
public CancellableTask runGlobalDelayed(Runnable task, long delay) {
return Bukkit.getServer().getGlobalRegionScheduler().runDelayed(this.plugin, scheduledTask -> task.run(), delay)::cancel;
}
diff --git a/src/main/java/de/fanta/challenges/schedular/Scheduler.java b/src/main/java/de/fanta/challenges/schedular/Scheduler.java
index aa95d1b..149ca5e 100644
--- a/src/main/java/de/fanta/challenges/schedular/Scheduler.java
+++ b/src/main/java/de/fanta/challenges/schedular/Scheduler.java
@@ -1,7 +1,8 @@
package de.fanta.challenges.schedular;
-import de.fanta.challenges.Challenges;
+import org.bukkit.Chunk;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.entity.Entity;
import java.util.function.Consumer;
@@ -12,6 +13,10 @@
void run(Runnable task);
+ void runLocal(Location location, Runnable task);
+
+ void runAtChunk(World world, int chunkX, int chunkZ, Runnable task);
+
CancellableTask runGlobalDelayed(Runnable task, long delay);
default void runGlobalDelayed(Runnable task) {
diff --git a/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java b/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java
index 572f109..beae5da 100644
--- a/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java
+++ b/src/main/java/de/fanta/challenges/scoreboard/FoliaScoreBoardManager.java
@@ -1,11 +1,22 @@
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.teams.ChallengeTeam;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
-public class FoliaScoreBoardManager implements ScoreBoardMananger{
+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;
@@ -20,7 +31,66 @@
@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();
+ }
+
+ // 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();
+ }
}
@Override
@@ -53,6 +123,16 @@
}
+ 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
public void updateEventScore(Scorable s) {
diff --git a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java
index 134de87..c23cb3b 100644
--- a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java
+++ b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java
@@ -4,15 +4,16 @@
import de.fanta.challenges.Challenges;
import de.fanta.challenges.SaveSlot;
import de.fanta.challenges.ServerType;
-import de.fanta.challenges.challenges.AllItemsChallenge;
import org.apache.commons.io.FileUtils;
import org.bukkit.Bukkit;
+import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
+import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
public class SaveWorldUtils {
@@ -24,12 +25,12 @@
}
public static void saveWorld(@Nullable Player player, String saveID, SaveSlot saveSlot) {
- if (plugin.isFolia()) {
+ /*if (plugin.isFolia()) {
if (player != null) {
ChatUtil.sendErrorMessage(player, "Auf diesem Server können aktuell keine Welten gespeichert werden!");
}
return;
- }
+ }*/
try {
@@ -47,17 +48,31 @@
World world_world = Bukkit.getWorlds().get(0);
World world_nether = Bukkit.getWorlds().get(1);
World world_end = Bukkit.getWorlds().get(2);
- world_world.save();
- world_nether.save();
- world_end.save();
+
+ if (!plugin.isFolia()) {
+ world_world.save();
+ world_nether.save();
+ world_end.save();
+ }
+
for (Player p : Bukkit.getOnlinePlayers()) {
p.saveData();
}
NMSUtils nms = plugin.getNMSUtils();
if (nms != null) {
- nms.getWorldUtils().saveWorldNow(world_world);
- nms.getWorldUtils().saveWorldNow(world_end);
- nms.getWorldUtils().saveWorldNow(world_nether);
+ if (!plugin.isFolia()) {
+ nms.getWorldUtils().saveWorldNow(world_world);
+ nms.getWorldUtils().saveWorldNow(world_end);
+ nms.getWorldUtils().saveWorldNow(world_nether);
+ } else {
+ for (World world : Bukkit.getWorlds()) {
+ for (Chunk chunk : world.getLoadedChunks()) {
+ Bukkit.getServer().getRegionScheduler().run(plugin, world, chunk.getX(), chunk.getZ(), scheduledTask -> {
+ nms.getWorldUtils().saveChunkNow(chunk);
+ });
+ }
+ }
+ }
}
File dir = new File(saveID);
File configs = new File("plugins/Challenges");
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index efdd8bf..f32a95f 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]
+softdepend: [CubesideStatistics, ProtocolLib]
folia-supported: true
commands:
hp: