diff --git a/pom.xml b/pom.xml index 61899b4..4ce1453 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,14 @@ viaversion-repo https://repo.viaversion.com + + dmulloy2-repo + https://repo.dmulloy2.net/repository/public/ + + + eldonexus + https://eldonexus.de/repository/maven-releases/ + @@ -62,6 +70,18 @@ provided + com.comphenix.protocol + ProtocolLib + 4.7.0 + provided + + + com.github.yannicklamprecht.worldborderapi + api + 1.170.0 + provided + + org.jetbrains annotations RELEASE diff --git a/src/main/java/de/fanta/challenges/Challenges.java b/src/main/java/de/fanta/challenges/Challenges.java index 4b0ffd6..9a9a20d 100644 --- a/src/main/java/de/fanta/challenges/Challenges.java +++ b/src/main/java/de/fanta/challenges/Challenges.java @@ -1,7 +1,8 @@ package de.fanta.challenges; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; import de.cubeside.nmsutils.NMSUtils; -import de.fanta.challenges.challenges.BingoChallengeEvent; import de.fanta.challenges.challenges.MLGChallenge; import de.fanta.challenges.challenges.RandomDropsChallenge; import de.fanta.challenges.commands.CommandRegistration; @@ -47,6 +48,8 @@ private static Challenges plugin; + private ProtocolManager protocolManager; + private File backpackConfigFile; private FileConfiguration BackpackConfig; @@ -90,6 +93,7 @@ public void onEnable() { LOGGER = getLogger(); plugin = this; + protocolManager = ProtocolLibrary.getProtocolManager(); nmsUtils = getServer().getServicesManager().load(NMSUtils.class); this.timer = new Timer(this); @@ -377,4 +381,8 @@ public NMSUtils getNMSUtils() { return nmsUtils; } + + public ProtocolManager getProtocolManager() { + return protocolManager; + } } diff --git a/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java b/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java index 2ebbae8..e7c5bf4 100644 --- a/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java @@ -1,25 +1,21 @@ package de.fanta.challenges.challenges; +import com.github.yannicklamprecht.worldborder.api.BorderAPI; +import com.github.yannicklamprecht.worldborder.api.WorldBorderApi; import de.fanta.challenges.Challenges; -import de.fanta.challenges.utils.ChatUtil; -import io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent; import org.bukkit.Bukkit; import org.bukkit.GameMode; -import org.bukkit.GameRule; -import org.bukkit.OfflinePlayer; import org.bukkit.Sound; -import org.bukkit.World; -import org.bukkit.WorldBorder; 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.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerExpChangeEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLevelChangeEvent; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.world.SpawnChangeEvent; public class WorldBorderLevelChallenge implements Listener { @@ -30,7 +26,7 @@ Player p = e.getPlayer(); if (plugin.getTimer().isRunning() && e.getPlayer().getGameMode() == GameMode.SURVIVAL && !plugin.getVanish().isVanish(p)) { if (plugin.getConfig().getBoolean("worldborderlevel")) { - xpSync(e.getPlayer()); + xpSync(e.getPlayer(), false); } } } @@ -40,7 +36,12 @@ Player p = e.getPlayer(); if (plugin.getTimer().isRunning() && e.getPlayer().getGameMode() == GameMode.SURVIVAL && !plugin.getVanish().isVanish(p)) { if (plugin.getConfig().getBoolean("worldborderlevel")) { - xpSync(e.getPlayer()); + xpSync(e.getPlayer(), true); + if (e.getOldLevel() < e.getNewLevel()) { + for (Player pp : Bukkit.getOnlinePlayers()) { + pp.playSound(pp.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 0.03f, 1); + } + } } } } @@ -54,36 +55,71 @@ } @EventHandler - public void border(WorldBorderBoundsChangeEvent e) { - if (e.getNewSize() > e.getOldSize()) { - if (plugin.getConfig().getBoolean("worldborderlevel")) { - for (Player pp : Bukkit.getOnlinePlayers()) { - pp.playSound(pp.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 0.01f, 1); - } + public void onRespawn(PlayerRespawnEvent e) { + if (plugin.getConfig().getBoolean("worldborderlevel")) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + WorldBorderApi worldBorderAPI = BorderAPI.getApi(); + worldBorderAPI.setBorder(e.getPlayer(), plugin.getCurrentEditor().getLevel(), e.getPlayer().getWorld().getSpawnLocation()); + }, 5L); + } + } + + @EventHandler + public void onWorldSpawnChange(SpawnChangeEvent e) { + if (plugin.getConfig().getBoolean("worldborderlevel")) { + for (Player pp : Bukkit.getOnlinePlayers()) { + xpSync(pp, true); } } } - private void xpSync(Player p) { - if (Bukkit.getServer().getOnlinePlayers().size() >= 2) { + @EventHandler + public void onJoin(PlayerJoinEvent e) { + Player p = e.getPlayer(); + if (plugin.getConfig().getBoolean("worldborderlevel")) { Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { - for (Player player : Bukkit.getOnlinePlayers()) { - if (player != p) { + WorldBorderApi worldBorderAPI = BorderAPI.getApi(); + xpSync(e.getPlayer(), true); + }, 10L); + } + } + + @EventHandler + public void onWorldChange(PlayerChangedWorldEvent e) { + if (plugin.getConfig().getBoolean("worldborderlevel")) { + e.getPlayer().getWorld().setSpawnLocation(Bukkit.getWorld("world").getSpawnLocation()); + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + WorldBorderApi worldBorderAPI = BorderAPI.getApi(); + worldBorderAPI.setBorder(e.getPlayer(), plugin.getCurrentEditor().getLevel(), e.getPlayer().getWorld().getSpawnLocation()); + }, 10L); + } + } + + private void xpSync(Player p, Boolean borderupdate) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + for (Player player : Bukkit.getOnlinePlayers()) { + if (player != p) { + if (p.getPlayer() != null) { player.setLevel(p.getPlayer().getLevel()); player.setExp(p.getPlayer().getExp()); } } + } + if (borderupdate) { Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { - for (World w : plugin.getServer().getWorlds()) { - if (w != null) { - WorldBorder border = w.getWorldBorder(); - if (plugin.getCurrentEditor() != null) { - border.setSize(plugin.getCurrentEditor().getLevel(), 5); + if (plugin.getCurrentEditor() != null) { + for (Player player : Bukkit.getOnlinePlayers()) { + int level = player.getLevel(); + WorldBorderApi worldBorderAPI = BorderAPI.getApi(); + if (level > 0) { + worldBorderAPI.setBorder(player, level, player.getWorld().getSpawnLocation()); + } else { + worldBorderAPI.setBorder(player, 1, player.getWorld().getSpawnLocation()); } } } }, 1L); - }, 1L); - } + } + }, 1L); } } diff --git a/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java b/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java index 8e6b44a..c919c12 100644 --- a/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java +++ b/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java @@ -1,5 +1,7 @@ package de.fanta.challenges.guis.settingsgui; +import com.github.yannicklamprecht.worldborder.api.BorderAPI; +import com.github.yannicklamprecht.worldborder.api.WorldBorderApi; import de.fanta.challenges.Challenges; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.guiutils.GUIUtils; @@ -370,11 +372,15 @@ for (World w : plugin.getServer().getWorlds()) { if (w != null) { w.getWorldBorder().setCenter(w.getSpawnLocation()); - w.getWorldBorder().setSize(0); } } for (Player pp : Bukkit.getOnlinePlayers()) { + WorldBorderApi worldBorderAPI = BorderAPI.getApi(); + worldBorderAPI.setBorder(pp, 1, plugin.getServer().getWorld("world").getSpawnLocation()); + } + + for (Player pp : Bukkit.getOnlinePlayers()) { pp.teleport(pp.getWorld().getSpawnLocation()); } GUIUtils.sendTitleToAll("Challenge", "World Border Level aktiviert", ChatUtil.GREEN); diff --git a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java index 8bebdfb..512743d 100644 --- a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java +++ b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java @@ -1,6 +1,7 @@ package de.fanta.challenges.listeners; -import com.destroystokyo.paper.event.player.PlayerAdvancementCriterionGrantEvent; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; import de.fanta.challenges.Challenges; import de.fanta.challenges.events.PlayerCountChangedEvent; import de.fanta.challenges.utils.ChatUtil; @@ -8,6 +9,7 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -21,9 +23,11 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; import org.kitteh.vanish.event.VanishStatusChangeEvent; import org.spigotmc.event.player.PlayerSpawnLocationEvent; +import java.lang.reflect.InvocationTargetException; import java.util.Objects; import static org.bukkit.Bukkit.getServer; @@ -164,4 +168,33 @@ } } } + + /*@EventHandler + public void onSneak(PlayerToggleSneakEvent e) { + Player player = e.getPlayer(); + World world = player.getWorld(); + + PacketContainer initfakeborder = new PacketContainer(PacketType.Play.Server.INITIALIZE_BORDER); + initfakeborder.getDoubles(). + write(0, world.getSpawnLocation().getX()). + write(1, world.getSpawnLocation().getZ()); + initfakeborder.getLongs().write(0, 1L); + + PacketContainer centerfakeborder = new PacketContainer(PacketType.Play.Server.SET_BORDER_CENTER); + centerfakeborder.getDoubles(). + write(0, world.getSpawnLocation().getX()). + write(1, world.getSpawnLocation().getZ()); + + PacketContainer sizefakeborder = new PacketContainer(PacketType.Play.Server.SET_BORDER_SIZE); + sizefakeborder.getDoubles(). + write(0, 10000000000.0); + try { + plugin.getProtocolManager().sendServerPacket(player, initfakeborder); + plugin.getProtocolManager().sendServerPacket(player, centerfakeborder); + plugin.getProtocolManager().sendServerPacket(player, sizefakeborder); + } catch (InvocationTargetException ex) { + throw new RuntimeException( + "Cannot send packet " + initfakeborder, ex); + } + }*/ } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 8c13281..1beffe2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,7 +4,7 @@ load: STARTUP api-version: 1.17 author: ${project.author} -depend: [CubesideUtils, VanishNoPacket, GlobalPort, CubesideNMSUtils] +depend: [CubesideUtils, VanishNoPacket, GlobalPort, CubesideNMSUtils, ProtocolLib, WorldBorderAPI] loadbefore: - CubesideSettings commands: