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: