diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml index 03814a265..5112d034d 100644 --- a/.github/workflows/maven-build.yml +++ b/.github/workflows/maven-build.yml @@ -23,16 +23,6 @@ jobs: distribution: 'temurin' cache: 'maven' - - name: Install Local Dependencies - run: | - mvn install:install-file \ - -Dfile=libs/PaperSpigot-1.8.8-R0.1-SNAPSHOT.jar \ - -DgroupId=org.github.paperspigot \ - -DartifactId=paperspigot-api \ - -Dversion=1.8.8-R0.1-SNAPSHOT \ - -Dpackaging=jar \ - -DgeneratePom=true - - name: Build with Maven run: mvn -B clean install --file pom.xml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fff7c3bb8..5284041f4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,21 +27,6 @@ jobs: distribution: 'temurin' cache: 'maven' - - name: Install Local Dependencies - run: | - # Ensure this path matches your repo structure - if [ -f "libs/PaperSpigot-1.8.8-R0.1-SNAPSHOT.jar" ]; then - mvn install:install-file \ - -Dfile=libs/PaperSpigot-1.8.8-R0.1-SNAPSHOT.jar \ - -DgroupId=org.github.paperspigot \ - -DartifactId=paperspigot-api \ - -Dversion=1.8.8-R0.1-SNAPSHOT \ - -Dpackaging=jar \ - -DgeneratePom=true - else - echo "Warning: Local dependency not found, skipping install." - fi - - name: Check Version & Tag id: check_version run: | diff --git a/.gitignore b/.gitignore index 3bb5e7191..383dd064b 100644 --- a/.gitignore +++ b/.gitignore @@ -114,4 +114,4 @@ test_servers/ # Local scripts reset-dev.sh -CLAUDE.md \ No newline at end of file +AGENTS.md \ No newline at end of file diff --git a/LICENSE b/LICENSE index 3e5b0132e..a33aadb58 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 ZonePractice contributors +Copyright (c) 2026 ZonePractice contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 6bb969c97..3c4b3c149 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ For detailed guides on setup, configuration, and feature usage, please visit our ## Supported Versions -- Primary targets: **1.8.8**, **1.8.9** (legacy), and **modern 1.20.6 / 1.21.X** +- Primary targets: **1.20.6 / 1.21.X** - Actual supported versions are detected at runtime via the `VersionChecker` - The plugin automatically disables itself on unsupported versions @@ -45,11 +45,8 @@ shaded into ZonePractice. ## Repository Structure -- **core/** – main logic and shared systems (`practice-core-*.jar`) -- **spigot_1_8_8/** – legacy 1.8.8 platform build -- **spigot_modern/** – modern 1.20.x / 1.21.x builds +- **core/** – main logic (`practice-core-*.jar`) - **distribution/** – release packaging (`ZonePractice Pro v*.jar`) -- **libs/** – helper jars and forked server builds for development --- @@ -74,11 +71,6 @@ system before cloning or pulling updates: ## Building 1. **Prerequisites:** Install JDK (Java 21 recommended for modern builds, _it is not gonna work on Java 25_) and Maven. -2. **Install Local Dependencies:** - Since the PaperSpigot API is not available in public repositories, install it manually from the `libs` folder: - ```bash - mvn install:install-file -Dfile=libs/PaperSpigot-1.8.8-R0.1-SNAPSHOT.jar -DgroupId=org.github.paperspigot -DartifactId=paperspigot-api -Dversion=1.8.8-R0.1-SNAPSHOT -Dpackaging=jar -DgeneratePom=true - ``` 3. **Build the Project:** ```bash mvn clean package @@ -94,7 +86,7 @@ system before cloning or pulling updates: - Default configuration files are generated automatically. Templates live under `core/src/main/resources//` ( e.g., `config.yml`, `divisions.yml`, `guis.yml`, `inventories.yml`). -- `config.yml` includes a `VERSION` field (e.g., 13 for the legacy 1.8.8 template). Review updated templates when +- `config.yml` includes a `VERSION` field (e.g., 13). Review updated templates when upgrading. - Optional MySQL storage is available via the `MYSQL-DATABASE` section; back up configs before enabling. - Read console output for version validation, warnings and load messages. @@ -256,7 +248,7 @@ Defined in `plugin.yml`: ### MySQL Errors -- Verify MySQL settings in `1.8.8/config.yml` or `modern/config.yml` +- Verify MySQL settings in `config.yml` - Ensure the database accepts external connections - JDBC is handled via `DriverManager`; ensure a suitable MySQL driver is available diff --git a/core/pom.xml b/core/pom.xml index 94d3bd0bc..cc09fb726 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -7,7 +7,7 @@ dev.nandi0813 practice-parent - 6.4.6-SNAPSHOT + 7.0.0-SNAPSHOT practice-core @@ -19,8 +19,8 @@ maven-compiler-plugin 3.8.1 - 17 - 17 + 21 + 21 @@ -32,6 +32,27 @@ + + + + enginehub + https://maven.enginehub.org/repo/ + + + + + + + + com.intellectualsites.bom + bom-newest + 1.55 + import + pom + + + + @@ -42,9 +63,9 @@ - org.github.paperspigot - paperspigot-api - 1.8.8-R0.1-SNAPSHOT + io.papermc.paper + paper-api + 1.21.11-R0.1-SNAPSHOT provided @@ -83,6 +104,25 @@ 5.5.0 provided + + + + com.fastasyncworldedit + FastAsyncWorldEdit-Core + provided + + + + com.fastasyncworldedit + FastAsyncWorldEdit-Bukkit + provided + + + FastAsyncWorldEdit-Core + * + + + \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/ZonePractice.java b/core/src/main/java/dev/nandi0813/practice/ZonePractice.java index 63fd28794..461684fa8 100644 --- a/core/src/main/java/dev/nandi0813/practice/ZonePractice.java +++ b/core/src/main/java/dev/nandi0813/practice/ZonePractice.java @@ -22,16 +22,21 @@ import dev.nandi0813.practice.command.staff.StaffCommand; import dev.nandi0813.practice.command.statistics.StatisticsCommand; import dev.nandi0813.practice.listener.*; -import dev.nandi0813.practice.manager.arena.ArenaListener; import dev.nandi0813.practice.manager.arena.ArenaManager; +import dev.nandi0813.practice.manager.arena.listener.ArenaCopyUtilListener; +import dev.nandi0813.practice.manager.arena.listener.ArenaListener; import dev.nandi0813.practice.manager.arena.setup.SpawnMarkerManager; import dev.nandi0813.practice.manager.arena.util.ArenaWorldUtil; import dev.nandi0813.practice.manager.backend.*; import dev.nandi0813.practice.manager.division.DivisionManager; import dev.nandi0813.practice.manager.fight.event.EventManager; +import dev.nandi0813.practice.manager.fight.ffa.FFAListener; import dev.nandi0813.practice.manager.fight.ffa.FFAManager; -import dev.nandi0813.practice.manager.fight.listener.BuildBlockListener; +import dev.nandi0813.practice.manager.fight.listener.BuildListener; +import dev.nandi0813.practice.manager.fight.listener.EPCountdownListener; +import dev.nandi0813.practice.manager.fight.listener.FireworkRocketCooldownListener; import dev.nandi0813.practice.manager.fight.match.MatchManager; +import dev.nandi0813.practice.manager.fight.util.EntityHider; import dev.nandi0813.practice.manager.fight.util.EntityHiderListener; import dev.nandi0813.practice.manager.gui.setup.arena.ArenaGUISetupManager; import dev.nandi0813.practice.manager.inventory.InventoryManager; @@ -44,10 +49,7 @@ import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.server.ServerManager; import dev.nandi0813.practice.manager.sidebar.SidebarManager; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.module.util.VersionChecker; import dev.nandi0813.practice.util.*; -import dev.nandi0813.practice.util.UpdateChecker; import dev.nandi0813.practice.util.placeholderapi.PlayerExpansion; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; import lombok.Getter; @@ -74,6 +76,10 @@ public final class ZonePractice extends JavaPlugin { private static BukkitAudiences adventure; @Getter private static MiniMessage miniMessage; + @Getter + private static EntityHider entityHider; + @Getter + private static ArenaCopyUtilListener arenaCopyUtilListener; @Getter private static volatile boolean fullyLoaded = false; @@ -91,11 +97,14 @@ public void onEnable() { instance = this; adventure = BukkitAudiences.create(this); miniMessage = MiniMessage.miniMessage(); + entityHider = new EntityHider(this, EntityHider.Policy.BLACKLIST); + arenaCopyUtilListener = new ArenaCopyUtilListener(); + PacketEvents.getAPI().init(); metrics = new Metrics(this, 16055); if (VersionChecker.getBukkitVersion() == null) { - Common.sendConsoleMMMessage("Unsupported server version! Please use 1.8.8 or 1.8.9 or 1.20.6 or 1.21.X"); + Common.sendConsoleMMMessage("Unsupported server version! Please use 1.20.6 or 1.21.X"); Bukkit.getPluginManager().disablePlugin(this); return; } @@ -354,8 +363,6 @@ private void loadPlaceholderAPI() { * It registers all the events that are used in the plugin */ private void registerListeners(PluginManager pm) { - pm.registerEvents(new BuildBlockListener(), this); - pm.registerEvents(ClassImport.getClasses().getBuildListener(), this); pm.registerEvents(new PlayerPreLogin(), this); pm.registerEvents(new PlayerJoin(), this); @@ -367,6 +374,13 @@ private void registerListeners(PluginManager pm) { pm.registerEvents(new PlayerCommandPreprocess(), this); pm.registerEvents(new EntityDamage(), this); pm.registerEvents(new ArenaListener(), this); + pm.registerEvents(new StatisticListener(), this); + pm.registerEvents(arenaCopyUtilListener, this); + pm.registerEvents(new BuildListener(), this); + pm.registerEvents(new FFAListener(), this); + pm.registerEvents(new EPCountdownListener(), this); + pm.registerEvents(new FireworkRocketCooldownListener(), this); + pm.registerEvents(new PlayerChatListener(), this); } } diff --git a/core/src/main/java/dev/nandi0813/practice/command/arena/arguments/Set/IconArg.java b/core/src/main/java/dev/nandi0813/practice/command/arena/arguments/Set/IconArg.java index 60ed8c77b..d9d4b194d 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/arena/arguments/Set/IconArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/arena/arguments/Set/IconArg.java @@ -3,10 +3,10 @@ import dev.nandi0813.practice.manager.arena.ArenaManager; import dev.nandi0813.practice.manager.arena.arenas.interfaces.DisplayArena; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.gui.setup.arena.ArenaGUISetupManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -41,8 +41,8 @@ public static void run(Player player, String label, String[] args) { return; } - ItemStack icon = ClassImport.getClasses().getPlayerUtil().getPlayerMainHand(player); - if (icon == null || icon.getType().equals(Material.AIR)) { + ItemStack icon = PlayerUtil.getPlayerMainHand(player); + if (icon.getType().equals(Material.AIR)) { Common.sendMMMessage(player, LanguageManager.getString("COMMAND.ARENA.ARGUMENTS.ICON.ICON-IN-HAND")); return; } diff --git a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/BracketsArg.java b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/BracketsArg.java index ca51dbd34..e86ad0641 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/BracketsArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/BracketsArg.java @@ -1,13 +1,12 @@ package dev.nandi0813.practice.command.event.arguments.Events; -import dev.nandi0813.practice.command.event.arguments.SpawnPointArg; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.event.EventManager; import dev.nandi0813.practice.manager.fight.event.enums.EventType; import dev.nandi0813.practice.manager.fight.event.events.duel.brackets.BracketsData; import dev.nandi0813.practice.manager.fight.event.util.EventUtil; -import dev.nandi0813.practice.module.interfaces.KitData; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.KitData; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; diff --git a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/JuggernautArg.java b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/JuggernautArg.java index d14258eb5..fbb0ec2b5 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/JuggernautArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/JuggernautArg.java @@ -1,13 +1,12 @@ package dev.nandi0813.practice.command.event.arguments.Events; -import dev.nandi0813.practice.command.event.arguments.SpawnPointArg; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.event.EventManager; import dev.nandi0813.practice.manager.fight.event.enums.EventType; import dev.nandi0813.practice.manager.fight.event.events.onevsall.juggernaut.JuggernautData; import dev.nandi0813.practice.manager.fight.event.util.EventUtil; -import dev.nandi0813.practice.module.interfaces.KitData; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.KitData; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; diff --git a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/LMSArg.java b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/LMSArg.java index 909ed9f14..67e3dbb1b 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/LMSArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/LMSArg.java @@ -1,13 +1,12 @@ package dev.nandi0813.practice.command.event.arguments.Events; -import dev.nandi0813.practice.command.event.arguments.SpawnPointArg; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.event.EventManager; import dev.nandi0813.practice.manager.fight.event.enums.EventType; import dev.nandi0813.practice.manager.fight.event.events.ffa.lms.LMSData; import dev.nandi0813.practice.manager.fight.event.util.EventUtil; -import dev.nandi0813.practice.module.interfaces.KitData; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.KitData; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; diff --git a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/SumoArg.java b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/SumoArg.java index 096e9d85f..8a3df0756 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/SumoArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/event/arguments/Events/SumoArg.java @@ -1,13 +1,12 @@ package dev.nandi0813.practice.command.event.arguments.Events; -import dev.nandi0813.practice.command.event.arguments.SpawnPointArg; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.event.EventManager; import dev.nandi0813.practice.manager.fight.event.enums.EventType; import dev.nandi0813.practice.manager.fight.event.events.duel.sumo.SumoData; import dev.nandi0813.practice.manager.fight.event.util.EventUtil; -import dev.nandi0813.practice.module.interfaces.KitData; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.KitData; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; diff --git a/core/src/main/java/dev/nandi0813/practice/command/ffa/FFACommand.java b/core/src/main/java/dev/nandi0813/practice/command/ffa/FFACommand.java index 8f857bc4e..91a4c7f5b 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/ffa/FFACommand.java +++ b/core/src/main/java/dev/nandi0813/practice/command/ffa/FFACommand.java @@ -2,6 +2,10 @@ import dev.nandi0813.practice.command.ffa.arguments.*; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.ffa.FFAManager; +import dev.nandi0813.practice.manager.profile.Profile; +import dev.nandi0813.practice.manager.profile.ProfileManager; +import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; import dev.nandi0813.practice.util.Common; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -26,11 +30,14 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String if (args.length > 0) { switch (args[0]) { case "join": - JoinArg.run(player, label, args); + openArenaSelectorGui(player); break; case "leave": LeaveArg.run(player); break; + case "kit": + KitArg.run(player); + break; case "spec": case "spectate": SpectateArg.run(player, label, args); @@ -42,12 +49,24 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String HelpArg.run(player, label); break; } - } else - HelpArg.run(player, label); + } else { + openArenaSelectorGui(player); + } return true; } + private static void openArenaSelectorGui(Player player) { + Profile profile = ProfileManager.getInstance().getProfile(player); + if (!profile.getStatus().equals(ProfileStatus.LOBBY)) { + Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.JOIN.CANT-JOIN-FFA")); + return; + } + + FFAManager.getInstance().getArenaSelectorGui().update(); + FFAManager.getInstance().getArenaSelectorGui().open(player); + } + @Override public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { List arguments = new ArrayList<>(); @@ -57,14 +76,14 @@ public List onTabComplete(CommandSender sender, Command command, String if (args.length == 1) { arguments.add("join"); arguments.add("leave"); + arguments.add("kit"); arguments.add("list"); StringUtil.copyPartialMatches(args[0], arguments, completion); } else { - if (args[0].equalsIgnoreCase("join")) { - completion = JoinArg.tabComplete(player, args); - } else if (args[0].equalsIgnoreCase("spectate")) + if (args[0].equalsIgnoreCase("spectate")) { completion = SpectateArg.tabComplete(player, args); + } } Collections.sort(completion); diff --git a/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/JoinArg.java b/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/JoinArg.java deleted file mode 100644 index c15c510a3..000000000 --- a/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/JoinArg.java +++ /dev/null @@ -1,70 +0,0 @@ -package dev.nandi0813.practice.command.ffa.arguments; - -import dev.nandi0813.practice.manager.arena.ArenaManager; -import dev.nandi0813.practice.manager.arena.arenas.FFAArena; -import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.manager.fight.ffa.game.FFA; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.util.Common; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; - -import java.util.ArrayList; -import java.util.List; - - -public enum JoinArg { - ; - - public static void run(Player player, String label, String[] args) { - if (args.length != 2) { - Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.JOIN.HELP").replace("%label%", label)); - return; - } - - FFAArena ffaArena = ArenaManager.getInstance().getFFAArena(args[1]); - if (ffaArena == null) { - Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.JOIN.ARENA-NOT-FOUND")); - return; - } - - FFA ffa = ffaArena.getFfa(); - if (ffa == null || !ffa.isOpen()) { - Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.JOIN.ARENA-CLOSED").replace("%arena%", ffaArena.getDisplayName())); - return; - } - - Profile profile = ProfileManager.getInstance().getProfile(player); - if (!profile.getStatus().equals(ProfileStatus.LOBBY)) { - Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.JOIN.CANT-JOIN-FFA")); - return; - } - - ffa.getLadderSelectorGui().update(); - ffa.getLadderSelectorGui().open(player); - } - - public static List tabComplete(Player player, String[] args) { - Profile profile = ProfileManager.getInstance().getProfile(player); - List arguments = new ArrayList<>(); - - if (!profile.getStatus().equals(ProfileStatus.LOBBY)) - return arguments; - - if (args.length == 2) { - for (FFAArena ffaArena : ArenaManager.getInstance().getFFAArenas()) { - FFA ffa = ffaArena.getFfa(); - if (ffa != null && ffa.isOpen()) { - arguments.add(ffaArena.getName()); - } - } - - return StringUtil.copyPartialMatches(args[1], arguments, new ArrayList<>()); - } - - return arguments; - } - -} diff --git a/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/KitArg.java b/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/KitArg.java new file mode 100644 index 000000000..d5f7197b7 --- /dev/null +++ b/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/KitArg.java @@ -0,0 +1,24 @@ +package dev.nandi0813.practice.command.ffa.arguments; + +import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.ffa.FFAManager; +import dev.nandi0813.practice.manager.fight.ffa.game.FFA; +import dev.nandi0813.practice.util.Common; +import org.bukkit.entity.Player; + +public enum KitArg { + ; + + public static void run(Player player) { + FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); + if (ffa == null) { + Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.KIT.NOT-IN-FFA")); + return; + } + + ffa.getLadderSelectorGui().update(); + ffa.getLadderSelectorGui().open(player); + } + +} + diff --git a/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/SpectateArg.java b/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/SpectateArg.java index ee3d93408..abda51fe9 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/SpectateArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/ffa/arguments/SpectateArg.java @@ -36,7 +36,7 @@ public static void run(Player player, String label, String[] args) { } Profile profile = ProfileManager.getInstance().getProfile(player); - if (!profile.getStatus().equals(ProfileStatus.LOBBY)) { + if (!profile.getStatus().equals(ProfileStatus.LOBBY) && !profile.getStatus().equals(ProfileStatus.SPECTATE)) { Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.SPECTATE.CANT-JOIN-FFA")); return; } @@ -48,7 +48,7 @@ public static List tabComplete(Player player, String[] args) { Profile profile = ProfileManager.getInstance().getProfile(player); List arguments = new ArrayList<>(); - if (!profile.getStatus().equals(ProfileStatus.LOBBY)) + if (!profile.getStatus().equals(ProfileStatus.LOBBY) && !profile.getStatus().equals(ProfileStatus.SPECTATE)) return arguments; if (args.length == 2) { diff --git a/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/EffectArg.java b/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/EffectArg.java index 1e823c150..2ff05f7fe 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/EffectArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/EffectArg.java @@ -8,7 +8,6 @@ import dev.nandi0813.practice.util.Common; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; -import org.bukkit.util.StringUtil; import java.util.ArrayList; import java.util.List; @@ -38,7 +37,7 @@ public static void run(Player player, String label, String[] args) { return; } - List effects = (List) player.getActivePotionEffects(); + List effects = new ArrayList<>(player.getActivePotionEffects()); if (effects.isEmpty()) { Common.sendMMMessage(player, LanguageManager.getString("COMMAND.LADDER.ARGUMENTS.EFFECT.NO-EFFECTS")); return; @@ -51,17 +50,7 @@ public static void run(Player player, String label, String[] args) { } public static List tabComplete(Player player, String[] args) { - List arguments = new ArrayList<>(); - if (!player.hasPermission("zpp.setup")) return arguments; - - if (args.length == 3) { - for (Ladder ladder : LadderManager.getInstance().getLadders()) - arguments.add(ladder.getName()); - - return StringUtil.copyPartialMatches(args[2], arguments, new ArrayList<>()); - } - - return arguments; + return IconArg.tabComplete(player, args); } } diff --git a/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/IconArg.java b/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/IconArg.java index 4d213e6a7..cc6a1f915 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/IconArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/ladder/arguments/IconArg.java @@ -1,13 +1,13 @@ package dev.nandi0813.practice.command.ladder.arguments; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.gui.setup.ladder.LadderSetupManager; import dev.nandi0813.practice.manager.ladder.LadderManager; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -42,8 +42,8 @@ public static void run(Player player, String label, String[] args) { return; } - ItemStack icon = ClassImport.getClasses().getPlayerUtil().getPlayerMainHand(player); - if (icon == null || icon.getType().equals(Material.AIR)) { + ItemStack icon = PlayerUtil.getPlayerMainHand(player); + if (icon.getType().equals(Material.AIR)) { Common.sendMMMessage(player, LanguageManager.getString("COMMAND.LADDER.ARGUMENTS.ICON.NO-ITEM").replace("%ladder%", ladder.getDisplayName())); return; } diff --git a/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/ArenasArg.java b/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/ArenasArg.java index 560389e7d..3bbcd5fa5 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/ArenasArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/ArenasArg.java @@ -2,7 +2,7 @@ import dev.nandi0813.practice.manager.arena.util.ArenaWorldUtil; import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.util.Common; import org.bukkit.GameMode; import org.bukkit.entity.Player; @@ -16,7 +16,7 @@ public static void run(Player player) { return; } - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + PlayerUtil.clearInventory(player); player.setGameMode(GameMode.CREATIVE); player.setAllowFlight(true); player.setFlying(true); diff --git a/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/RenameArg.java b/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/RenameArg.java index d30eb39b4..f11847207 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/RenameArg.java +++ b/core/src/main/java/dev/nandi0813/practice/command/practice/arguments/RenameArg.java @@ -25,7 +25,8 @@ public static void run(Player player, String label, String[] args) { return; } - if (player.getItemInHand() == null || player.getItemInHand().getType().equals(Material.AIR)) { + ItemStack handItem = player.getInventory().getItemInMainHand(); + if (handItem.getType().equals(Material.AIR)) { Common.sendMMMessage(player, LanguageManager.getString("COMMAND.PRACTICE.ARGUMENTS.RENAME.ITEM-IN-HAND")); return; } @@ -39,11 +40,11 @@ public static void run(Player player, String label, String[] args) { builder.append(" "); } - ItemStack item = player.getItemInHand(); + ItemStack item = player.getInventory().getItemInMainHand(); ItemMeta itemMeta = item.getItemMeta(); - itemMeta.setDisplayName(StringUtil.CC(builder.toString())); + itemMeta.displayName(Common.legacyToComponent(StringUtil.CC(builder.toString()))); item.setItemMeta(itemMeta); - player.setItemInHand(item); + player.getInventory().setItemInMainHand(item); } } diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/PlayerChatListener.java b/core/src/main/java/dev/nandi0813/practice/listener/PlayerChatListener.java similarity index 95% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/PlayerChatListener.java rename to core/src/main/java/dev/nandi0813/practice/listener/PlayerChatListener.java index 7763c78e3..5fb21f24a 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/PlayerChatListener.java +++ b/core/src/main/java/dev/nandi0813/practice/listener/PlayerChatListener.java @@ -1,4 +1,4 @@ -package dev.nandi0813.practice_modern.listener; +package dev.nandi0813.practice.listener; import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.ConfigManager; @@ -9,8 +9,8 @@ import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.util.ChatFormatUtil; import dev.nandi0813.practice.util.Common; -import dev.nandi0813.practice.util.SoftDependUtil; import dev.nandi0813.practice.util.PAPIUtil; +import dev.nandi0813.practice.util.SoftDependUtil; import io.papermc.paper.event.player.AsyncChatEvent; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; @@ -30,7 +30,9 @@ public void onPlayerChat(AsyncChatEvent e) { Player player = e.getPlayer(); Profile profile = ProfileManager.getInstance().getProfile(player); Party party = PartyManager.getInstance().getParty(player); - String message = PlainTextComponentSerializer.plainText().serialize(e.message()); + String message = ZonePractice.getMiniMessage().escapeTags( + PlainTextComponentSerializer.plainText().serialize(e.message()) + ); // --- Party chat --- if (ConfigManager.getBoolean("CHAT.PARTY-CHAT-ENABLED") && profile.isParty() && party != null && message.startsWith("@")) { diff --git a/core/src/main/java/dev/nandi0813/practice/listener/PlayerInteract.java b/core/src/main/java/dev/nandi0813/practice/listener/PlayerInteract.java index 75c323d5a..42f03406e 100644 --- a/core/src/main/java/dev/nandi0813/practice/listener/PlayerInteract.java +++ b/core/src/main/java/dev/nandi0813/practice/listener/PlayerInteract.java @@ -3,8 +3,9 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.util.ClassImport; +import io.papermc.paper.event.player.PlayerFlowerPotManipulateEvent; import org.bukkit.Material; +import org.bukkit.attribute.Attribute; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -12,11 +13,35 @@ import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; +import java.util.Objects; + public class PlayerInteract implements Listener { + @EventHandler + public void onFlowerPotManipulate(PlayerFlowerPotManipulateEvent e) { + // Only block taking flowers out of pots; placing flowers remains unchanged. + if (e.isPlacing()) { + return; + } + + Profile profile = ProfileManager.getInstance().getProfile(e.getPlayer()); + if (profile == null) { + return; + } + + switch (profile.getStatus()) { + case MATCH: + case FFA: + case EVENT: + e.setCancelled(true); + break; + default: + break; + } + } + @EventHandler public void onSoup(PlayerInteractEvent e) { Player player = e.getPlayer(); @@ -32,10 +57,10 @@ public void onSoup(PlayerInteractEvent e) { if (profile.getStatus().equals(ProfileStatus.MATCH) || profile.getStatus().equals(ProfileStatus.EVENT)) { // Soup listener if (action.equals(Action.RIGHT_CLICK_BLOCK) || action.equals(Action.RIGHT_CLICK_AIR)) { - if (item != null && item.getType().equals(ClassImport.getClasses().getItemMaterialUtil().getMushroomSoup())) { + if (item != null && item.getType().equals(Material.MUSHROOM_STEW)) { int food = player.getFoodLevel(); double health = player.getHealth(); - double maxHealth = player.getMaxHealth(); + double maxHealth = Objects.requireNonNull(player.getAttribute(Attribute.MAX_HEALTH)).getValue(); double regen = 6.5; if (food < 20) e.setCancelled(true); @@ -43,10 +68,10 @@ public void onSoup(PlayerInteractEvent e) { if (health == maxHealth) return; if ((health + regen) < maxHealth) { - player.getInventory().getItemInHand().setType(Material.BOWL); + player.getInventory().setItemInMainHand(new ItemStack(Material.BOWL)); player.setHealth(health + regen); } else if ((health + regen) >= maxHealth) { - player.getInventory().getItemInHand().setType(Material.BOWL); + player.getInventory().setItemInMainHand(new ItemStack(Material.BOWL)); player.setHealth(maxHealth); } player.updateInventory(); @@ -75,14 +100,4 @@ public void onPlayerSleep(PlayerInteractEvent e) { public void onPlayerSleep(PlayerBedEnterEvent e) { e.setCancelled(true); } - - @EventHandler - public void enderPearlTpFix(PlayerTeleportEvent e) { - if (e.getCause().equals(PlayerTeleportEvent.TeleportCause.ENDER_PEARL)) { - e.getTo().setX(Math.floor(e.getTo().getX()) + 0.5f); - e.getTo().setY(Math.floor(e.getTo().getY()) + 0.5f); - e.getTo().setZ(Math.floor(e.getTo().getZ()) + 0.5f); - } - } - -} +} \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/listener/PlayerQuit.java b/core/src/main/java/dev/nandi0813/practice/listener/PlayerQuit.java index 88bd22151..8e093e62d 100644 --- a/core/src/main/java/dev/nandi0813/practice/listener/PlayerQuit.java +++ b/core/src/main/java/dev/nandi0813/practice/listener/PlayerQuit.java @@ -1,6 +1,7 @@ package dev.nandi0813.practice.listener; import dev.nandi0813.practice.ZonePractice; +import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.party.Party; import dev.nandi0813.practice.manager.party.PartyManager; import dev.nandi0813.practice.manager.profile.Profile; @@ -11,6 +12,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; public class PlayerQuit implements Listener { @@ -25,6 +27,8 @@ public void onPlayerQuit(PlayerQuitEvent e) { if (party != null) party.removeMember(player, false); + MatchManager.getInstance().invalidateRematchByPlayer(player); + if (profile != null) { profile.setLastJoin(System.currentTimeMillis()); @@ -39,4 +43,9 @@ public void onPlayerQuit(PlayerQuitEvent e) { } } + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerKick(PlayerKickEvent e) { + MatchManager.getInstance().invalidateRematchByPlayer(e.getPlayer()); + } + } diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/StatisticListener.java b/core/src/main/java/dev/nandi0813/practice/listener/StatisticListener.java similarity index 71% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/StatisticListener.java rename to core/src/main/java/dev/nandi0813/practice/listener/StatisticListener.java index 87333f6d3..47793ddb7 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/StatisticListener.java +++ b/core/src/main/java/dev/nandi0813/practice/listener/StatisticListener.java @@ -1,4 +1,4 @@ -package dev.nandi0813.practice_modern.interfaces; +package dev.nandi0813.practice.listener; import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.ConfigManager; @@ -7,12 +7,14 @@ import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.ladder.type.Boxing; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.sidebar.SidebarManager; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -28,13 +30,26 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; -public class StatisticListener extends dev.nandi0813.practice.module.interfaces.StatisticListener implements Listener { +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class StatisticListener implements Listener { private boolean CUSTOM_COOLDOWN_ENABLED; private boolean ONLY_SWORD; private double CUSTOM_COOLDOWN_VALUE; + @Getter + protected final ZonePractice practice = ZonePractice.getInstance(); + @Getter + protected static final Map CURRENT_CPS = new ConcurrentHashMap<>(); + @Getter + protected static final Map CPS = new ConcurrentHashMap<>(); + @Getter + protected static final Map CURRENT_COMBO = new ConcurrentHashMap<>(); + public StatisticListener() { Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { CUSTOM_COOLDOWN_ENABLED = ConfigManager.getBoolean("MATCH-SETTINGS.BOXING.CUSTOM-ATTACK-COOLDOWN.ENABLED"); @@ -52,7 +67,7 @@ public void onClick(PlayerInteractEvent e) { Player player = e.getPlayer(); Profile profile = ProfileManager.getInstance().getProfile(player); - if (ClassImport.getClasses().getPlayerUtil().getItemInUse(player, Material.FISHING_ROD) != null) { + if (PlayerUtil.getItemInUse(player, Material.FISHING_ROD) != null) { return; } @@ -87,6 +102,53 @@ public void onClick(PlayerInteractEvent e) { task.runTaskLaterAsynchronously(ZonePractice.getInstance(), 20L); } + protected static @NotNull BukkitRunnable cpsRunnable(final Statistic statistic, Player player) { + return new BukkitRunnable() { + @Override + public void run() { + // Remove atomically — avoids the TOCTOU race between containsKey and get + // that can return null and cause an NPE when unboxing to int. + Integer current = CURRENT_CPS.remove(player); + if (current != null && current > 2) { + statistic.getCps().put(System.currentTimeMillis(), current); + CPS.put(player, current); + } + } + }; + } + + protected static @NotNull BukkitRunnable hitRunnable(final Player attacker, final Statistic attackerStats, final Player defender, final Statistic defenderStats) { + return new BukkitRunnable() { + @Override + public void run() { + if (attackerStats != null) { + attackerStats.setHit(attackerStats.getHit() + 1); + + CURRENT_COMBO.putIfAbsent(attacker, 1); + CURRENT_COMBO.computeIfPresent(attacker, (key, val) -> val + 1); + } + + if (defenderStats != null) { + defenderStats.setGetHit(defenderStats.getGetHit() + 1); + + if (CURRENT_COMBO.containsKey(defender) && defenderStats.getLongestCombo() < CURRENT_COMBO.get(defender)) { + defenderStats.setLongestCombo(CURRENT_COMBO.get(defender)); + } + CURRENT_COMBO.put(defender, 0); + } + + // Immediately update scoreboards for real-time hit counter display + // Schedule on main thread since scoreboard updates must be on main thread + if (attacker != null && defender != null) { + ZonePractice.getInstance().getServer().getScheduler().runTask( + ZonePractice.getInstance(), + () -> SidebarManager.getInstance().updatePlayersSidebar(attacker, defender) + ); + } + } + }; + } + @EventHandler ( priority = EventPriority.LOWEST ) public void onPlayerHit(EntityDamageByEntityEvent e) { if (e.isCancelled()) return; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/ArenaType.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/ArenaType.java index 2e89dea05..5e3a6c0bd 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/ArenaType.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/ArenaType.java @@ -1,7 +1,6 @@ package dev.nandi0813.practice.manager.arena; import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import lombok.Getter; import org.bukkit.Material; @@ -12,7 +11,7 @@ public enum ArenaType { BASIC(LanguageManager.getString("ARENA.ARENA-TYPES.BASIC.NAME"), Material.DIAMOND_SWORD, false, LanguageManager.getList("ARENA.ARENA-TYPES.BASIC.DESCRIPTION")), BUILD(LanguageManager.getString("ARENA.ARENA-TYPES.BUILD.NAME"), Material.IRON_PICKAXE, true, LanguageManager.getList("ARENA.ARENA-TYPES.BUILD.DESCRIPTION")), - FFA(LanguageManager.getString("ARENA.ARENA-TYPES.FFA.NAME"), ClassImport.getClasses().getItemMaterialUtil().getGoldSword(), false, LanguageManager.getList("ARENA.ARENA-TYPES.FFA.DESCRIPTION")); + FFA(LanguageManager.getString("ARENA.ARENA-TYPES.FFA.NAME"), Material.GOLDEN_SWORD, false, LanguageManager.getList("ARENA.ARENA-TYPES.FFA.DESCRIPTION")); private final String name; @Getter diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/ArenaCopy.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/ArenaCopy.java index bf5622cad..81f0e3993 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/ArenaCopy.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/ArenaCopy.java @@ -1,7 +1,7 @@ package dev.nandi0813.practice.manager.arena.arenas; +import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.arenas.interfaces.NormalArena; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import lombok.Getter; @@ -18,7 +18,7 @@ public ArenaCopy(String name, Arena originalArena) { } public void delete() { - ClassImport.getClasses().getArenaCopyUtil().deleteArena(mainArena.getDisplayName(), cuboid); + ZonePractice.getArenaCopyUtilListener().deleteArena(mainArena.getDisplayName(), cuboid); mainArena.getArenaFile().getConfig().set("copies." + name, null); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/BasicArena.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/BasicArena.java index 55a494644..2f336d17a 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/BasicArena.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/BasicArena.java @@ -2,9 +2,9 @@ import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.ArenaManager; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import lombok.Getter; @@ -96,7 +96,7 @@ public boolean teleport(Player player) { public void loadChunks() { if (this.cuboid != null) { Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> { - ClassImport.getClasses().getArenaUtil().loadArenaChunks(this); + ArenaUtil.loadArenaChunks(this); if (ArenaManager.LOAD_CHUNKS) { // Collect only chunks that are already loaded — this avoids diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/DisplayArena.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/DisplayArena.java index a7287c639..808421022 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/DisplayArena.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/arenas/interfaces/DisplayArena.java @@ -16,15 +16,14 @@ import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.gui.setup.arena.ArenaGUISetupManager; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; +import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.StringUtil; import lombok.Getter; import lombok.Setter; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; @Getter @@ -62,7 +61,7 @@ public void setIcon(final ItemStack icon) { this.icon = icon.clone(); if (icon.hasItemMeta()) - this.displayName = StringUtil.CC(icon.getItemMeta().getDisplayName()); + this.displayName = StringUtil.CC(Common.getItemDisplayName(icon)); else this.displayName = name; } diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ArenaCopyUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/listener/ArenaCopyUtilListener.java similarity index 86% rename from core/src/main/java/dev/nandi0813/practice/module/interfaces/ArenaCopyUtil.java rename to core/src/main/java/dev/nandi0813/practice/manager/arena/listener/ArenaCopyUtilListener.java index 95f32c89e..44fe87363 100644 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ArenaCopyUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/listener/ArenaCopyUtilListener.java @@ -1,4 +1,4 @@ -package dev.nandi0813.practice.module.interfaces; +package dev.nandi0813.practice.manager.arena.listener; import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.ArenaManager; @@ -6,20 +6,22 @@ import dev.nandi0813.practice.manager.arena.arenas.ArenaCopy; import dev.nandi0813.practice.manager.arena.util.ArenaWorldUtil; import dev.nandi0813.practice.manager.arena.util.BedLocation; +import dev.nandi0813.practice.manager.arena.util.FaweUtil; import dev.nandi0813.practice.manager.arena.util.PortalLocation; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.gui.setup.arena.ArenaGUISetupManager; import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.module.interfaces.actionbar.ActionBar; import dev.nandi0813.practice.util.*; +import dev.nandi0813.practice.util.actionbar.ActionBar; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -30,7 +32,7 @@ import java.util.Iterator; import java.util.List; -public abstract class ArenaCopyUtil implements Listener { +public class ArenaCopyUtilListener implements Listener { @Getter private static List copyingCuboids = new ArrayList<>(); @@ -182,8 +184,6 @@ protected static boolean isCuboidContainsLocation(Location location) { return false; } - protected abstract void copyArena(Profile profile, ArenaCopy arenaCopy, Cuboid copyFrom, Location reference, Location newLocation); - protected void copyNormal(Profile profile, ArenaCopy arenaCopy, Cuboid copyFrom, Location reference, Location newLocation) { final World copyWorld = ArenaWorldUtil.getArenasCopyWorld(); @@ -197,7 +197,7 @@ protected void copyNormal(Profile profile, ArenaCopy arenaCopy, Cuboid copyFrom, arenaCopy.getMainArena().setCopying(true); - dev.nandi0813.practice.module.interfaces.actionbar.ActionBar actionBar = null; + ActionBar actionBar = null; if (!profile.getActionBar().isLock()) { actionBar = profile.getActionBar(); actionBar.setLock(true); @@ -276,8 +276,6 @@ public void run() { }.runTaskTimer(ZonePractice.getInstance(), 0, 1L); } - public abstract void deleteArena(final String arena, final Cuboid cuboid); - protected void deleteNormal(final String arena, final Cuboid cuboid) { // OPTIMIZATION: Use iterator directly instead of creating a full list in memory final Iterator iterator = cuboid.iterator(); @@ -302,7 +300,7 @@ public void run() { continue; } - block.setType(Material.AIR); + block.setBlockData(Material.AIR.createBlockData()); changeCounter++; } } catch (Exception e) { @@ -350,7 +348,7 @@ protected static void cancelTask(BukkitRunnable runnable, ArenaCopy arenaCopy, A runnable.cancel(); arenaCopy.getMainArena().setCopying(false); - ArenaCopyUtil.getCopyingCuboids().remove(arenaCopy.getCuboid()); + ArenaCopyUtilListener.getCopyingCuboids().remove(arenaCopy.getCuboid()); removeCopyingChunks(arenaCopy.getCuboid()); // Unregister chunks removeNonPlayerEntities(arenaCopy.getCuboid()); @@ -361,13 +359,13 @@ protected static void cancelTask(BukkitRunnable runnable, ArenaCopy arenaCopy, A /** * Removes all non-player entities from a cuboid. - * NOTE: Skips hologram armor stands to prevent leaderboard holograms from disappearing. + * NOTE: Skips hologram text displays to prevent leaderboard holograms from disappearing. */ protected static void removeNonPlayerEntities(Cuboid cuboid) { cuboid.getEntities().forEach(entity -> { if (!(entity instanceof Player)) { - // Skip hologram armor stands - if (dev.nandi0813.practice.manager.leaderboard.hologram.ArmorStandFactory.isHologramArmorStand(entity)) { + // Skip hologram text displays + if (dev.nandi0813.practice.manager.leaderboard.hologram.TextDisplayFactory.isHologramTextDisplay(entity)) { return; } entity.remove(); @@ -375,6 +373,44 @@ protected static void removeNonPlayerEntities(Cuboid cuboid) { }); } - protected abstract void copyBlock(Block oldBlock, Block newBlock); + protected void copyBlock(Block oldBlock, Block newBlock) { + try { + // OPTIMIZATION: Set type without physics for massive speedup + newBlock.setType(oldBlock.getType(), false); + + BlockState oldState = oldBlock.getState(); + BlockState newState = newBlock.getState(); + + // Clone block data + newState.setBlockData(oldState.getBlockData().clone()); + newState.update(true, false); // force=true, applyPhysics=false + + newBlock.setBiome(oldBlock.getBiome()); + } catch (Exception e) { + // Skip problematic blocks (e.g., MaterialData type incompatibilities) + // This allows the copy process to continue without halting + } + } + + protected void copyArena(Profile profile, ArenaCopy arenaCopy, Cuboid copyFrom, Location reference, Location newLocation) { + if (SoftDependUtil.isFAWE_ENABLED) { + FaweUtil.copyFAWE(copyFrom, reference, newLocation); + + arenaCopy.getMainArena().getCopies().add(arenaCopy); + ArenaGUISetupManager.getInstance().getArenaSetupGUIs().get(arenaCopy.getMainArena()).get(GUIType.Arena_Copy).update(); + ArenaGUISetupManager.getInstance().getArenaSetupGUIs().get(arenaCopy.getMainArena()).get(GUIType.Arena_Main).update(); + GUIManager.getInstance().searchGUI(GUIType.Arena_Summary).update(); + } else { + this.copyNormal(profile, arenaCopy, copyFrom, reference, newLocation); + } + } + + public void deleteArena(final String arena, final Cuboid cuboid) { + if (SoftDependUtil.isFAWE_ENABLED) { + FaweUtil.deleteFAWE(cuboid); + } else { + deleteNormal(arena, cuboid); + } + } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/ArenaListener.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/listener/ArenaListener.java similarity index 77% rename from core/src/main/java/dev/nandi0813/practice/manager/arena/ArenaListener.java rename to core/src/main/java/dev/nandi0813/practice/manager/arena/listener/ArenaListener.java index 84594e63c..d6029b626 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/ArenaListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/listener/ArenaListener.java @@ -1,5 +1,7 @@ -package dev.nandi0813.practice.manager.arena; +package dev.nandi0813.practice.manager.arena.listener; +import dev.nandi0813.practice.ZonePractice; +import dev.nandi0813.practice.manager.arena.ArenaManager; import dev.nandi0813.practice.manager.arena.arenas.Arena; import dev.nandi0813.practice.manager.arena.arenas.interfaces.BasicArena; import dev.nandi0813.practice.manager.arena.util.ArenaUtil; @@ -8,6 +10,7 @@ import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; +import dev.nandi0813.practice.manager.server.ServerManager; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import org.bukkit.Location; @@ -20,9 +23,27 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.WorldUnloadEvent; + +import static dev.nandi0813.practice.manager.arena.ArenaManager.LOADED_CHUNKS; +import static dev.nandi0813.practice.manager.arena.ArenaManager.LOAD_CHUNKS; public class ArenaListener implements Listener { + @EventHandler + public void onPlayerPortalEvent(PlayerPortalEvent e) { + Player player = e.getPlayer(); + World world = player.getWorld(); + + if (world.equals(ArenaWorldUtil.getArenasCopyWorld())) { + e.setCancelled(true); + } else if (world.equals(ArenaWorldUtil.getArenasWorld())) { + e.setCancelled(true); + } + } + @EventHandler ( priority = EventPriority.HIGHEST ) public void onBlockBreak(BlockBreakEvent e) { Player player = e.getPlayer(); @@ -143,4 +164,33 @@ public void onPlayerInteract(PlayerInteractEvent e) { } } + @EventHandler + public void onChunkUnload(ChunkUnloadEvent e) { + if (LOAD_CHUNKS) { + if (LOADED_CHUNKS.contains(e.getChunk())) { + // Use addPluginChunkTicket to force-keep the chunk loaded. + // This is safe from recursion (unlike getChunkAtAsync which can + // trigger chunk scheduling → more unloads → StackOverflowError). + e.getChunk().addPluginChunkTicket(ZonePractice.getInstance()); + } + } + } + + @EventHandler + public void onWorldUnload(WorldUnloadEvent e) { + if (e.getWorld() == ArenaWorldUtil.getArenasWorld()) { + e.setCancelled(true); + return; + } + + if (e.getWorld() == ArenaWorldUtil.getArenasCopyWorld()) { + e.setCancelled(true); + return; + } + + if (ServerManager.getLobby() != null && ServerManager.getLobby().getWorld() == e.getWorld()) { + e.setCancelled(true); + } + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupListener.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupListener.java index 77dcfa1e8..e957e2c10 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupListener.java @@ -9,23 +9,26 @@ import dev.nandi0813.practice.manager.arena.util.PortalLocation; import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.util.BedUtil; import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.gui.setup.arena.ArenaGUISetupManager; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Mannequin; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.player.*; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerQuitEvent; import java.util.ArrayList; import java.util.List; @@ -253,7 +256,7 @@ private void handleBedLocations(Player player, Arena arena, Action action, Playe if (isOutsideRegion(player, arena, block.getLocation())) return; - BedLocation bedLocation = ClassImport.getClasses().getBedUtil().getBedLocation(block); + BedLocation bedLocation = BedUtil.getBedLocation(block); if (action == Action.LEFT_CLICK_BLOCK) { arena.setBedLoc1(bedLocation); @@ -534,25 +537,15 @@ private static void cleanupAfterRegionChange(Player player, DisplayArena arena) updateGui(arena); } - // Prevent players from manipulating marker armor stands + // Handle right-clicking mannequin markers to remove them (FFA ONLY) @EventHandler ( priority = EventPriority.HIGHEST ) - public void onArmorStandManipulate(PlayerArmorStandManipulateEvent event) { - ArmorStand armorStand = event.getRightClicked(); - - if (SpawnMarkerManager.getInstance().isMarker(armorStand)) { - event.setCancelled(true); - } - } - - // Handle right-clicking armor stand markers to remove them (FFA ONLY) - @EventHandler ( priority = EventPriority.HIGHEST ) - public void onArmorStandInteract(PlayerInteractAtEntityEvent event) { - if (!(event.getRightClicked() instanceof ArmorStand armorStand)) return; + public void onMarkerInteract(PlayerInteractAtEntityEvent event) { + if (!(event.getRightClicked() instanceof Mannequin mannequin)) return; Player player = event.getPlayer(); // Check if this is a spawn marker - if (!SpawnMarkerManager.getInstance().isMarker(armorStand)) return; + if (!SpawnMarkerManager.getInstance().isMarker(mannequin)) return; event.setCancelled(true); @@ -563,7 +556,7 @@ public void onArmorStandInteract(PlayerInteractAtEntityEvent event) { } // Find which arena this marker belongs to - DisplayArena arena = SpawnMarkerManager.getInstance().getArenaForMarker(armorStand); + DisplayArena arena = SpawnMarkerManager.getInstance().getArenaForMarker(mannequin); if (arena == null) { player.sendMessage(Common.colorize("&cCould not find arena for this marker.")); return; @@ -571,7 +564,7 @@ public void onArmorStandInteract(PlayerInteractAtEntityEvent event) { // ONLY allow for FFA arenas if (!(arena instanceof FFAArena ffaArena)) { - player.sendMessage(Common.colorize("&cDirect armor stand removal only works for FFA arenas.")); + player.sendMessage(Common.colorize("&cDirect marker removal only works for FFA arenas.")); player.sendMessage(Common.colorize("&7Use left/right click on blocks to set standard arena spawn positions.")); return; } @@ -590,7 +583,7 @@ public void onArmorStandInteract(PlayerInteractAtEntityEvent event) { } // Remove the marker and its spawn position - boolean removed = SpawnMarkerManager.getInstance().removeMarker(armorStand, arena); + boolean removed = SpawnMarkerManager.getInstance().removeMarker(mannequin, arena); if (removed) { SpawnMarkerManager.getInstance().updateMarkers(arena); updateGui(arena); @@ -601,12 +594,12 @@ public void onArmorStandInteract(PlayerInteractAtEntityEvent event) { } } - // Prevent damage to marker armor stands AND handle left-click removal + // Prevent damage to marker mannequins AND handle left-click removal @EventHandler ( priority = EventPriority.HIGHEST ) - public void onArmorStandDamage(EntityDamageByEntityEvent event) { - if (!(event.getEntity() instanceof ArmorStand armorStand)) return; + public void onMarkerDamage(EntityDamageByEntityEvent event) { + if (!(event.getEntity() instanceof Mannequin mannequin)) return; - if (!SpawnMarkerManager.getInstance().isMarker(armorStand)) return; + if (!SpawnMarkerManager.getInstance().isMarker(mannequin)) return; // Cancel damage in all cases event.setCancelled(true); @@ -618,7 +611,7 @@ public void onArmorStandDamage(EntityDamageByEntityEvent event) { if (!setupManager.isSettingUp(player)) return; // Find which arena this marker belongs to - DisplayArena arena = SpawnMarkerManager.getInstance().getArenaForMarker(armorStand); + DisplayArena arena = SpawnMarkerManager.getInstance().getArenaForMarker(mannequin); if (arena == null) return; // ONLY allow left-click removal for FFA arenas @@ -631,7 +624,7 @@ public void onArmorStandDamage(EntityDamageByEntityEvent event) { // Check if in correct mode if (session.getCurrentMode() != SetupMode.FFA_POSITIONS) return; - // Left-click on armor stand = Remove last spawn (same as left-click on block) + // Left-click on mannequin marker = Remove last spawn (same as left-click on block) if (!ffaArena.getFfaPositions().isEmpty()) { int index = ffaArena.getFfaPositions().size() - 1; ffaArena.getFfaPositions().remove(index); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupManager.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupManager.java index ee28e0c57..56b891b54 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/ArenaSetupManager.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class ArenaSetupManager { @@ -118,13 +119,13 @@ public List getPlayersSettingUpArena(DisplayArena arena) { } public boolean isSetupWand(ItemStack item) { - return item != null && item.getType() == Material.BLAZE_ROD && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().contains("Arena Wand"); + return item != null && item.getType() == Material.BLAZE_ROD && item.hasItemMeta() && Common.getItemDisplayName(item).contains("Arena Wand"); } public SetupMode getNextMode(DisplayArena arena, SetupMode current) { List validModes = getValidModes(arena); int currentIndex = validModes.indexOf(current); - if (currentIndex == -1) return validModes.get(0); + if (currentIndex == -1) return validModes.getFirst(); int nextIndex = (currentIndex + 1) % validModes.size(); return validModes.get(nextIndex); @@ -133,7 +134,7 @@ public SetupMode getNextMode(DisplayArena arena, SetupMode current) { public SetupMode getPreviousMode(DisplayArena arena, SetupMode current) { List validModes = getValidModes(arena); int currentIndex = validModes.indexOf(current); - if (currentIndex == -1) return validModes.get(0); + if (currentIndex == -1) return validModes.getFirst(); int prevIndex = (currentIndex - 1 + validModes.size()) % validModes.size(); return validModes.get(prevIndex); @@ -177,7 +178,7 @@ public void updateWand(Player player) { ItemMeta meta = wand.getItemMeta(); SetupMode mode = session.getCurrentMode(); - meta.setDisplayName(Common.colorize("&6Arena Wand &7(&e" + mode.getDisplayName() + "&7)")); + meta.displayName(Common.legacyToComponent(Common.colorize("&6Arena Wand &7(&e" + mode.getDisplayName() + "&7)"))); List lore = new ArrayList<>(); lore.add(Common.colorize("&7Editing: &a" + arena.getName())); @@ -197,9 +198,9 @@ public void updateWand(Player player) { lore.add(""); lore.add(Common.colorize("&cDrop (Q): &7Exit Setup")); - meta.setLore(lore); + meta.lore(lore.stream().map(Common::legacyToComponent).collect(Collectors.toList())); wand.setItemMeta(meta); - player.getInventory().setItemInHand(wand); + player.getInventory().setItemInMainHand(wand); } } \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/SpawnMarkerManager.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/SpawnMarkerManager.java index 4209e55bd..37a171923 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/SpawnMarkerManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/setup/SpawnMarkerManager.java @@ -3,19 +3,23 @@ import dev.nandi0813.practice.manager.arena.arenas.Arena; import dev.nandi0813.practice.manager.arena.arenas.FFAArena; import dev.nandi0813.practice.manager.arena.arenas.interfaces.DisplayArena; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; +import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.ItemCreateUtil; import lombok.Getter; +import net.kyori.adventure.text.Component; import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; +import org.bukkit.Material; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Mannequin; import org.bukkit.inventory.ItemStack; -import org.bukkit.util.EulerAngle; +import org.jetbrains.annotations.NotNull; import java.util.*; /** - * Manages armor stand markers that show spawn positions in arena setup mode. - * Armor stands face the direction the player will spawn and hold a sword. + * Manages mannequin markers that show spawn positions in arena setup mode. + * Mannequins face the direction the player will spawn and hold a sword. */ @Getter public class SpawnMarkerManager { @@ -29,13 +33,13 @@ public static SpawnMarkerManager getInstance() { return instance; } - // Map: Arena -> List of marker armor stands - private final Map> arenaMarkers = new HashMap<>(); + // Map: Arena -> List of marker mannequins + private final Map> arenaMarkers = new HashMap<>(); - // Set of all marker armor stand UUIDs for quick lookup + // Set of all marker mannequin UUIDs for quick lookup private final Set markerStandIds = new HashSet<>(); - // Map: Main marker armor stand -> spawn index (for FFA arenas) + // Map: Main marker mannequin -> spawn index (for FFA arenas) private final Map markerToSpawnIndex = new HashMap<>(); private SpawnMarkerManager() { @@ -50,18 +54,18 @@ public void showMarkers(DisplayArena arena) { // Clear existing markers first clearMarkers(arena); - List markers = new ArrayList<>(); + List markers = new ArrayList<>(); if (arena instanceof Arena standardArena) { // Show position 1 if (standardArena.getPosition1() != null) { - ArmorStand marker = createMarker(standardArena.getPosition1(), "&c&lSpawn 1"); + Mannequin marker = createMarker(standardArena.getPosition1(), "&c&lSpawn 1"); if (marker != null) markers.add(marker); } // Show position 2 if (standardArena.getPosition2() != null) { - ArmorStand marker = createMarker(standardArena.getPosition2(), "&c&lSpawn 2"); + Mannequin marker = createMarker(standardArena.getPosition2(), "&c&lSpawn 2"); if (marker != null) markers.add(marker); } } else if (arena instanceof FFAArena ffaArena) { @@ -69,15 +73,15 @@ public void showMarkers(DisplayArena arena) { int index = 0; // Use 0-based index to match the list for (Location spawnLoc : ffaArena.getFfaPositions()) { // Create main marker with player model - ArmorStand marker = createMarker(spawnLoc, "&c&lFFA Spawn #" + (index + 1)); // Display as 1-based + Mannequin marker = createMarker(spawnLoc, "&c&lFFA Spawn #" + (index + 1)); // Display as 1-based if (marker != null) { markers.add(marker); // Track this main marker to its spawn index markerToSpawnIndex.put(marker.getUniqueId(), index); - // Create second armor stand above for instruction text (closer spacing) + // Create second mannequin above for instruction text (closer spacing) Location labelLoc = spawnLoc.clone().add(0, 2.3, 0); - ArmorStand labelStand = createLabelOnly(labelLoc, "&7(Right-click to remove)"); + Mannequin labelStand = createLabelOnly(labelLoc, "&7(Right-click to remove)"); if (labelStand != null) { markers.add(labelStand); } @@ -92,71 +96,72 @@ public void showMarkers(DisplayArena arena) { } /** - * Creates an armor stand marker at the specified location + * Creates a mannequin marker at the specified location */ - private ArmorStand createMarker(Location location, String name) { - if (location == null || location.getWorld() == null) return null; - - // Spawn armor stand at exact player spawn position + private Mannequin createMarker(@NotNull Location location, @NotNull String name) { + // Spawn mannequin at exact player spawn position Location markerLoc = location.clone(); - ArmorStand armorStand = (ArmorStand) markerLoc.getWorld().spawnEntity(markerLoc, EntityType.ARMOR_STAND); - - // Configure armor stand to look like a player - armorStand.setVisible(true); // Show body to represent player - armorStand.setGravity(false); - armorStand.setCanPickupItems(false); - armorStand.setCustomNameVisible(true); - armorStand.setCustomName(dev.nandi0813.practice.util.StringUtil.CC(name)); - armorStand.setMarker(false); // Don't use marker mode so it has full size - armorStand.setBasePlate(false); - armorStand.setArms(true); + Mannequin mannequin = (Mannequin) markerLoc.getWorld().spawnEntity(markerLoc, EntityType.MANNEQUIN); + + // Configure mannequin to look like a player marker while staying static. + mannequin.setInvisible(false); // Show body to represent player + mannequin.setGravity(false); + mannequin.setCanPickupItems(false); + mannequin.setCustomNameVisible(true); + mannequin.customName(Component.text(dev.nandi0813.practice.util.StringUtil.CC(name))); + mannequin.setAI(false); + mannequin.setCollidable(false); + mannequin.setSilent(true); + mannequin.setImmovable(true); // Make it invulnerable and prevent interaction - ClassImport.getClasses().getArenaUtil().setArmorStandInvulnerable(armorStand); + ArenaUtil.setMannequinInvulnerable(mannequin); // Give diamond sword to right hand - ItemStack sword = ClassImport.getClasses().getItemMaterialUtil().getSword(); - ClassImport.getClasses().getArenaUtil().setArmorStandItemInHand(armorStand, sword, true); - - // Set arm pose to hold sword naturally (slight angle) - armorStand.setRightArmPose(new EulerAngle(Math.toRadians(280), Math.toRadians(10), 0)); + ItemStack sword = new ItemStack(Material.DIAMOND_SWORD); + ArenaUtil.setMannequinItemInHand(mannequin, sword, true); // Set player head (Steve head) for helmet - ItemStack playerHead = ClassImport.getClasses().getItemMaterialUtil().getDefaultPlayerHead(); - armorStand.setHelmet(playerHead); + ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD); + if (mannequin.getEquipment() != null) { + mannequin.getEquipment().setHelmet(playerHead); + } // Set red boots for visibility - ItemStack boots = ClassImport.getClasses().getItemMaterialUtil().getRedBoots(); - armorStand.setBoots(boots); + ItemStack boots = ItemCreateUtil.getRedBoots(); + if (mannequin.getEquipment() != null) { + mannequin.getEquipment().setBoots(boots); + } - // Track this armor stand - markerStandIds.add(armorStand.getUniqueId()); + // Track this mannequin + markerStandIds.add(mannequin.getUniqueId()); - return armorStand; + return mannequin; } /** - * Creates a small invisible armor stand just for displaying text label + * Creates a small invisible mannequin just for displaying text label */ - private ArmorStand createLabelOnly(Location location, String text) { + private Mannequin createLabelOnly(Location location, String text) { if (location == null || location.getWorld() == null) return null; - ArmorStand labelStand = (ArmorStand) location.getWorld().spawnEntity(location, EntityType.ARMOR_STAND); + Mannequin labelStand = (Mannequin) location.getWorld().spawnEntity(location, EntityType.MANNEQUIN); // Configure as invisible text-only display - labelStand.setVisible(false); // Invisible + labelStand.setInvisible(true); // Invisible labelStand.setGravity(false); labelStand.setCanPickupItems(false); labelStand.setCustomNameVisible(true); - labelStand.setCustomName(dev.nandi0813.practice.util.StringUtil.CC(text)); - labelStand.setMarker(true); // Tiny marker mode - labelStand.setBasePlate(false); - labelStand.setSmall(true); // Make it small + labelStand.customName(Component.text(dev.nandi0813.practice.util.StringUtil.CC(text))); + labelStand.setAI(false); + labelStand.setCollidable(false); + labelStand.setSilent(true); + labelStand.setImmovable(true); // Make it invulnerable - ClassImport.getClasses().getArenaUtil().setArmorStandInvulnerable(labelStand); + ArenaUtil.setMannequinInvulnerable(labelStand); - // Track this armor stand too + // Track this mannequin too markerStandIds.add(labelStand.getUniqueId()); return labelStand; @@ -168,15 +173,15 @@ private ArmorStand createLabelOnly(Location location, String text) { public void clearMarkers(DisplayArena arena) { if (arena == null) return; - List markers = arenaMarkers.remove(arena); + List markers = arenaMarkers.remove(arena); if (markers != null) { - for (ArmorStand marker : markers) { + for (Mannequin marker : markers) { if (marker != null) { // Always clean up tracking data markerStandIds.remove(marker.getUniqueId()); markerToSpawnIndex.remove(marker.getUniqueId()); // Clean up spawn index mapping - // Attempt to remove the armor stand if it's still valid + // Attempt to remove the mannequin if it's still valid if (marker.isValid()) { marker.remove(); } @@ -189,9 +194,9 @@ public void clearMarkers(DisplayArena arena) { * Clears all markers for all arenas */ public void clearAllMarkers() { - for (List markers : arenaMarkers.values()) { + for (List markers : arenaMarkers.values()) { if (markers != null) { - for (ArmorStand marker : markers) { + for (Mannequin marker : markers) { if (marker != null) { // Always clean up tracking data markerStandIds.remove(marker.getUniqueId()); @@ -254,20 +259,20 @@ public boolean hasMarkers(DisplayArena arena) { } /** - * Checks if an armor stand is a spawn marker + * Checks if a mannequin is a spawn marker */ - public boolean isMarker(ArmorStand armorStand) { - return armorStand != null && markerStandIds.contains(armorStand.getUniqueId()); + public boolean isMarker(Mannequin mannequin) { + return mannequin != null && markerStandIds.contains(mannequin.getUniqueId()); } /** - * Finds which arena a marker armor stand belongs to + * Finds which arena a marker mannequin belongs to */ - public DisplayArena getArenaForMarker(ArmorStand armorStand) { - if (armorStand == null) return null; + public DisplayArena getArenaForMarker(Mannequin mannequin) { + if (mannequin == null) return null; - for (Map.Entry> entry : arenaMarkers.entrySet()) { - if (entry.getValue().contains(armorStand)) { + for (Map.Entry> entry : arenaMarkers.entrySet()) { + if (entry.getValue().contains(mannequin)) { return entry.getKey(); } } @@ -275,15 +280,15 @@ public DisplayArena getArenaForMarker(ArmorStand armorStand) { } /** - * Removes a specific marker armor stand and its associated spawn position + * Removes a specific marker mannequin and its associated spawn position * * @return true if the marker was found and removed */ - public boolean removeMarker(ArmorStand armorStand, DisplayArena arena) { - if (armorStand == null || arena == null) return false; + public boolean removeMarker(Mannequin mannequin, DisplayArena arena) { + if (mannequin == null || arena == null) return false; - // Check if this armor stand is tracked with a spawn index (it's a main marker) - Integer spawnIndex = markerToSpawnIndex.get(armorStand.getUniqueId()); + // Check if this mannequin is tracked with a spawn index (it's a main marker) + Integer spawnIndex = markerToSpawnIndex.get(mannequin.getUniqueId()); if (spawnIndex == null) return false; // Not a main marker or not tracked // Remove from FFA arena @@ -294,23 +299,23 @@ public boolean removeMarker(ArmorStand armorStand, DisplayArena arena) { } // Clean up the mapping - markerStandIds.remove(armorStand.getUniqueId()); - markerToSpawnIndex.remove(armorStand.getUniqueId()); + markerStandIds.remove(mannequin.getUniqueId()); + markerToSpawnIndex.remove(mannequin.getUniqueId()); - // Remove the armor stand from tracking list - List markers = arenaMarkers.get(arena); + // Remove the mannequin from tracking list + List markers = arenaMarkers.get(arena); if (markers != null) { - markers.remove(armorStand); + markers.remove(mannequin); } - armorStand.remove(); + mannequin.remove(); return true; } /** - * Removes all orphaned marker armor stands from a world. - * This is useful for cleaning up armor stands that persisted after server restart + * Removes all orphaned marker mannequins from a world. + * This is useful for cleaning up mannequins that persisted after server restart * or were not properly removed due to timing issues. *

* Orphaned markers are identified by: @@ -327,17 +332,17 @@ public int cleanupOrphanedMarkers(org.bukkit.World world) { int removed = 0; List toRemove = new ArrayList<>(); - // Find all armor stands in the world + // Find all mannequins in the world for (org.bukkit.entity.Entity entity : world.getEntities()) { - if (entity instanceof ArmorStand armorStand) { + if (entity instanceof Mannequin mannequin) { // Check if this looks like one of our markers but isn't tracked - if (armorStand.getCustomName() != null && - !markerStandIds.contains(armorStand.getUniqueId())) { + String customName = mannequin.customName() == null ? null : Common.serializeComponentToLegacyString(mannequin.customName()); + if (customName != null && + !markerStandIds.contains(mannequin.getUniqueId())) { - String customName = armorStand.getCustomName(); // Check if it matches our marker naming patterns if (customName.contains("Spawn") || customName.contains("Right-click to remove")) { - toRemove.add(armorStand); + toRemove.add(mannequin); } } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaUtil.java index 267dabca3..db3a006e9 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaUtil.java @@ -10,16 +10,18 @@ import dev.nandi0813.practice.manager.fight.ffa.game.FFA; import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; +import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.ladder.enums.LadderType; +import dev.nandi0813.practice.util.BasicItem; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.NumberUtil; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import org.bukkit.*; +import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Mannequin; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; @@ -28,6 +30,14 @@ public enum ArenaUtil { ; + public static World createEmptyWorld(String worldName) { + WorldCreator wc = new WorldCreator(worldName); + wc.type(WorldType.FLAT); + wc.generateStructures(false); + wc.generatorSettings("{\"layers\": [{\"block\": \"air\", \"height\": 1}, {\"block\": \"air\", \"height\": 1}], \"biome\":\"plains\"}"); + return wc.createWorld(); + } + public static Arena getArena(BasicArena arena) { if (arena instanceof ArenaCopy) return ((ArenaCopy) arena).getMainArena(); @@ -158,10 +168,12 @@ public static boolean changeStatus(Player player, DisplayArena arena) { public static void setGamerules(World world) { world.setSpawnLocation(0, 60, 0); - world.setGameRuleValue("doDaylightCycle", "false"); - world.setGameRuleValue("doMobSpawning", "false"); - world.setGameRuleValue("showDeathMessages", "false"); - world.setGameRuleValue("doFireTick", "false"); + world.setGameRule(GameRules.SPAWN_MOBS, false); + world.setGameRule(GameRules.SHOW_DEATH_MESSAGES, false); + world.setGameRule(GameRules.ADVANCE_WEATHER, false); + world.setGameRule(GameRules.ALLOW_ENTERING_NETHER_USING_PORTALS, false); + world.setGameRule(GameRules.RAIDS, false); + world.setGameRule(GameRules.SHOW_ADVANCEMENT_MESSAGES, false); } public static void saveBedData(final YamlConfiguration config, final String path, final BedLocation bedLocation) { @@ -192,4 +204,96 @@ public static boolean isArenaPortalRelated(Arena arena) { return assignedLadders.contains(LadderType.BRIDGES) || assignedLadders.contains(LadderType.BATTLE_RUSH); } + public static boolean turnsToDirt(Block block) { + Material type = block.getType(); + return + type.equals(Material.GRASS_BLOCK) || + type.equals(Material.MYCELIUM) || + type.equals(Material.DIRT_PATH) || + type.equals(Material.FARMLAND) || + type.equals(Material.WARPED_NYLIUM); + } + + public static boolean containsDestroyableBlock(Ladder ladder, Block block) { + if (!(ladder instanceof NormalLadder normalLadder)) return false; + + if (!ladder.isBuild()) return false; + if (normalLadder.getDestroyableBlocks().isEmpty()) return false; + if (block == null) return false; + + for (BasicItem basicItem : normalLadder.getDestroyableBlocks()) { + if (block.getType().equals(basicItem.getMaterial())) + return true; + } + return false; + } + + public static boolean requiresSupport(Block block) { + Material type = block.getType(); + return org.bukkit.Tag.FLOWERS.isTagged(type) + || org.bukkit.Tag.SAPLINGS.isTagged(type) + || org.bukkit.Tag.CROPS.isTagged(type) + || org.bukkit.Tag.WALL_POST_OVERRIDE.isTagged(type) // torches, signs on walls, etc. + || type == Material.DEAD_BUSH + || type == Material.SHORT_GRASS + || type == Material.TALL_GRASS + || type == Material.FERN + || type == Material.LARGE_FERN + || type == Material.VINE + || type == Material.SUGAR_CANE + || type == Material.CACTUS + || type == Material.SNOW + || type == Material.TORCH + || type == Material.SOUL_TORCH + || type == Material.REDSTONE_WIRE + || type == Material.REDSTONE_TORCH + || type == Material.LEVER + || type == Material.COMPARATOR + || type == Material.REPEATER + || type == Material.TRIPWIRE_HOOK + || type == Material.TRIPWIRE + || type == Material.LILY_PAD + || type == Material.NETHER_WART; + } + + public static void loadArenaChunks(BasicArena arena) { + if (arena.getCuboid() == null) return; + org.bukkit.World world = arena.getCuboid().getWorld(); + if (world == null) return; + + // Calculate chunk coordinate range directly from the cuboid bounds + // instead of calling getChunks() which synchronously loads all chunks. + int minCX = arena.getCuboid().getLowerX() >> 4; + int maxCX = arena.getCuboid().getUpperX() >> 4; + int minCZ = arena.getCuboid().getLowerZ() >> 4; + int maxCZ = arena.getCuboid().getUpperZ() >> 4; + + org.bukkit.plugin.Plugin plugin = dev.nandi0813.practice.ZonePractice.getInstance(); + for (int cx = minCX; cx <= maxCX; cx++) { + for (int cz = minCZ; cz <= maxCZ; cz++) { + // addPluginChunkTicket loads the chunk asynchronously if needed + // and prevents it from being unloaded — no main-thread stall. + world.addPluginChunkTicket(cx, cz, plugin); + } + } + } + + public static void setMannequinItemInHand(Mannequin mannequin, ItemStack item, boolean rightHand) { + if (mannequin == null) return; + if (mannequin.getEquipment() == null) return; + + if (rightHand) { + mannequin.getEquipment().setItemInMainHand(item); + } else { + mannequin.getEquipment().setItemInOffHand(item); + } + } + + public static void setMannequinInvulnerable(Mannequin mannequin) { + if (mannequin == null) return; + mannequin.setInvulnerable(true); + // Keep setup markers non-persistent so they do not survive server restarts. + mannequin.setPersistent(false); + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaWorldUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaWorldUtil.java index 0e5981546..2ebf6d563 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaWorldUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/ArenaWorldUtil.java @@ -1,6 +1,5 @@ package dev.nandi0813.practice.manager.arena.util; -import dev.nandi0813.practice.module.util.ClassImport; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.World; @@ -15,12 +14,12 @@ public enum ArenaWorldUtil { public static void createArenaWorld() { if (arenasWorld == null) { - arenasWorld = ClassImport.getClasses().getWorldCreate().createEmptyWorld("arenas"); + arenasWorld = ArenaUtil.createEmptyWorld("arenas"); ArenaUtil.setGamerules(arenasWorld); } if (arenasCopyWorld == null) { - arenasCopyWorld = ClassImport.getClasses().getWorldCreate().createEmptyWorld("arenas_copy"); + arenasCopyWorld = ArenaUtil.createEmptyWorld("arenas_copy"); ArenaUtil.setGamerules(arenasCopyWorld); } } diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaCopy/FaweUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/FaweUtil.java similarity index 94% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaCopy/FaweUtil.java rename to core/src/main/java/dev/nandi0813/practice/manager/arena/util/FaweUtil.java index 4e0ab77f5..3d501c2b4 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaCopy/FaweUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/FaweUtil.java @@ -1,4 +1,4 @@ -package dev.nandi0813.practice_modern.interfaces.ArenaCopy; +package dev.nandi0813.practice.manager.arena.util; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; @@ -8,7 +8,6 @@ import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.block.BlockTypes; -import dev.nandi0813.practice.manager.arena.util.ArenaWorldUtil; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import org.bukkit.Location; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/arena/util/PortalLocation.java b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/PortalLocation.java index e6623d610..30d3f58e0 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/arena/util/PortalLocation.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/arena/util/PortalLocation.java @@ -1,6 +1,5 @@ package dev.nandi0813.practice.manager.arena.util; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Cuboid; import lombok.Getter; import org.bukkit.Location; @@ -29,10 +28,8 @@ public Location getCenter() { } public void setPortal() { - Material material = ClassImport.getClasses().getItemMaterialUtil().getEndPortal(); - for (Block block : cuboid.getBlocks()) { - block.setType(material); + block.setBlockData(Material.END_PORTAL.createBlockData()); block.getState().update(); } } @@ -51,10 +48,6 @@ public boolean isIn(Player player) { return cuboid.contains(player.getLocation()); } - public boolean isInsidePortalProtection(Location location, int maxDistance) { - return (center.distance(location) + 1) <= maxDistance; - } - public boolean isInsidePortalProtection(Block block, int maxDistance) { return (center.distance(block.getLocation()) + 1) <= maxDistance; } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendManager.java b/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendManager.java index 8aca538e3..07de882f4 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendManager.java @@ -43,7 +43,12 @@ public static void save() { try { config.save(file); } catch (IOException e) { - Common.sendConsoleMMMessage("Error: " + e.getMessage()); + Common.sendConsoleMMMessage("Error saving backend.yml: " + e.getMessage()); + } catch (Exception e) { + // Catches NullPointerException thrown by SnakeYAML when a ConfigurationSerializable + // (e.g. Location with a null world WeakReference) produces a null entry in its + // serialize() map. Log clearly instead of letting the async task swallow the trace. + Common.sendConsoleMMMessage("Error serializing backend.yml (possible null world in lobby location): " + e.getMessage()); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendUtil.java index b3ffbe8df..a555b9b20 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/backend/BackendUtil.java @@ -1,28 +1,93 @@ package dev.nandi0813.practice.manager.backend; import dev.nandi0813.practice.manager.gui.GUIItem; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.util.Common; +import org.bukkit.Material; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; + +import java.util.List; -/** - * Backend utility for loading items from configuration files. - * Delegates to version-specific ConfigItemProvider implementations. - */ public enum BackendUtil { ; - /** - * Creates a GUIItem from a YAML configuration using version-specific logic. - * - *

In 1.8.8: Uses DAMAGE value for item data (colors, variants)

- *

In Modern (1.13+): Ignores DAMAGE and makes items unbreakable to prevent durability bars

- * - * @param config The YAML configuration file - * @param loc The location path in the configuration (e.g., "ITEMS.EXAMPLE_ITEM") - * @return A fully configured GUIItem - */ public static GUIItem getGuiItem(YamlConfiguration config, String loc) { - return ClassImport.getClasses().getConfigItemProvider().getGuiItem(config, loc); + GUIItem guiItem = new GUIItem(); + + if (config.isString(loc + ".NAME")) { + guiItem.setName(config.getString(loc + ".NAME")); + } + + if (config.isString(loc + ".MATERIAL")) { + guiItem.setMaterial(Material.valueOf(config.getString(loc + ".MATERIAL"))); + } + + if (config.isInt(loc + ".AMOUNT")) { + int amount = config.getInt(loc + ".AMOUNT"); + if (amount <= 0 || amount > 64) { + amount = 1; + } + guiItem.setAmount(amount); + } + + if (config.isInt(loc + ".DURABILITY")) { + int durability = config.getInt(loc + ".DURABILITY"); + if (durability < 0) { + durability = 1; + } + guiItem.setDurability(durability); + } + + if (config.isList(loc + ".LORE")) { + guiItem.setLore(config.getStringList(loc + ".LORE")); + } + + if (config.isList(loc + ".FLAGS")) { + List flags = config.getStringList(loc + ".FLAGS"); + for (String flag : flags) { + try { + ItemFlag itemFlag = ItemFlag.valueOf(flag); + guiItem.addItemFlag(itemFlag); + } catch (IllegalArgumentException e) { + Common.sendConsoleMMMessage("Invalid ItemFlag: " + flag); + } + } + } + + // Always add flags to hide unbreakable and attributes for clean lobby items + guiItem.addItemFlag(ItemFlag.HIDE_UNBREAKABLE); + guiItem.addItemFlag(ItemFlag.HIDE_ATTRIBUTES); + + // Set unbreakable to prevent durability bars from showing + guiItem.setUnbreakable(true); + + if (config.isList(loc + ".ENCHANTMENTS")) { + for (String s : config.getStringList(loc + ".ENCHANTMENTS")) { + String[] enchantmentSplit = s.split(":"); + if (enchantmentSplit.length != 2) { + continue; + } + + try { + Enchantment enchantment = Common.resolveEnchantment(enchantmentSplit[0]); + int level = Integer.parseInt(enchantmentSplit[1]); + + if (enchantment == null) { + throw new IllegalArgumentException("Enchantment not found: " + enchantmentSplit[0]); + } + if (enchantment.getStartLevel() > level) { + level = enchantment.getStartLevel(); + } + + guiItem.addEnchantment(enchantment, level); + } catch (Exception e) { + Common.sendConsoleMMMessage("Enchantment not found: " + e); + } + } + } + + return guiItem; } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelManager.java b/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelManager.java index a5a45287c..bb7cf56cc 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelManager.java @@ -58,9 +58,21 @@ public void sendRequest(DuelRequest request) { new BukkitRunnable() { @Override public void run() { - getRequests().get(target).remove(request); + List targetRequests = getRequests().get(target); + if (targetRequests == null) { + return; + } + + boolean removed = targetRequests.remove(request); + if (targetRequests.isEmpty()) { + getRequests().remove(target); + } + + if (removed) { + request.handleExpiry(); + } } - }.runTaskLaterAsynchronously(ZonePractice.getInstance(), 20L * ConfigManager.getInt("MATCH-SETTINGS.DUEL.INVITATION-EXPIRY")); + }.runTaskLater(ZonePractice.getInstance(), 20L * ConfigManager.getInt("MATCH-SETTINGS.DUEL.INVITATION-EXPIRY")); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelRequest.java b/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelRequest.java index 100e8be9c..020dfda3e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelRequest.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/duel/DuelRequest.java @@ -3,9 +3,9 @@ import dev.nandi0813.practice.manager.arena.arenas.Arena; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.match.type.duel.Duel; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.util.LadderUtil; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import lombok.Getter; import lombok.Setter; @@ -22,13 +22,19 @@ public class DuelRequest { private Ladder ladder; private Arena arena; private int rounds; + private final Runnable expireHandler; public DuelRequest(Player sender, Player target, Ladder ladder, Arena arena, int rounds) { + this(sender, target, ladder, arena, rounds, null); + } + + public DuelRequest(Player sender, Player target, Ladder ladder, Arena arena, int rounds, Runnable expireHandler) { this.sender = sender; this.target = target; this.ladder = ladder; this.arena = arena; this.rounds = rounds; + this.expireHandler = expireHandler; } public void sendRequest() { @@ -44,7 +50,7 @@ public void sendRequest() { .replace("%arena%", arenaName) .replace("%rounds%", String.valueOf(rounds)) .replace("%target%", target.getName()) - .replace("%targetPing%", String.valueOf(ClassImport.getClasses().getPlayerUtil().getPing(target))) + .replace("%targetPing%", String.valueOf(PlayerUtil.getPing(target))) ); } @@ -54,7 +60,7 @@ public void sendRequest() { .replace("%arena%", arenaName) .replace("%rounds%", String.valueOf(rounds)) .replace("%sender%", sender.getName()) - .replace("%senderPing%", String.valueOf(ClassImport.getClasses().getPlayerUtil().getPing(sender))) + .replace("%senderPing%", String.valueOf(PlayerUtil.getPing(sender))) ); } } @@ -82,4 +88,10 @@ public void acceptRequest() { } } + public void handleExpiry() { + if (expireHandler != null) { + expireHandler.run(); + } + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/belowname/BelowNameManager.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/belowname/BelowNameManager.java index a9adf5ebd..89352fded 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/belowname/BelowNameManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/belowname/BelowNameManager.java @@ -7,10 +7,10 @@ import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerScoreboardObjective; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerUpdateScore; import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -30,7 +30,7 @@ public static BelowNameManager getInstance() { } private final String objectiveName = "ZPP_BELOW_NAME"; - private final Component displayName = Component.text(ChatColor.RED + "♥"); + private final Component displayName = Component.text("♥", NamedTextColor.RED); private final Map registeredUsers = Collections.synchronizedMap(new HashMap<>()); @@ -45,7 +45,7 @@ private BelowNameManager() { continue; } - double health = ClassImport.getClasses().getPlayerUtil().getPlayerHealth(otherPlayer); + double health = PlayerUtil.getPlayerHealth(otherPlayer); int hp = (int) Math.round(health); Component formattedHealth = Component.text(String.format("%.1f", health)); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/EventListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/EventListener.java index 39fcc0b9d..cc3da2dab 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/EventListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/EventListener.java @@ -8,10 +8,11 @@ import dev.nandi0813.practice.manager.fight.event.events.onevsall.tnttag.TNTTag; import dev.nandi0813.practice.manager.fight.event.interfaces.Event; import dev.nandi0813.practice.manager.fight.event.util.EventUtil; +import dev.nandi0813.practice.manager.fight.util.BlockUtil; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.StringUtil; import dev.nandi0813.practice.util.cooldown.CooldownObject; @@ -56,7 +57,7 @@ public void onTrackerUse(PlayerInteractEvent e) { return; } - ItemStack item = ClassImport.getClasses().getPlayerUtil().getItemInUse(player, EventManager.PLAYER_TRACKER.getType()); + ItemStack item = PlayerUtil.getItemInUse(player, EventManager.PLAYER_TRACKER.getType()); if (item == null) { return; } @@ -145,7 +146,7 @@ public void onEnderPearlLaunch(ProjectileLaunchEvent e) { public void onEntityExplode(EntityExplodeEvent e) { Entity entity = e.getEntity(); - if (entity.hasMetadata(TNTTag.TNT_TAG_TNT_METADATA)) { + if (BlockUtil.hasMetadata(entity, TNTTag.TNT_TAG_TNT_METADATA)) { e.blockList().clear(); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/enums/EventType.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/enums/EventType.java index 91d6ca07b..25c4a1da4 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/enums/EventType.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/enums/EventType.java @@ -2,7 +2,7 @@ import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.util.ItemCreateUtil; import lombok.Getter; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -15,7 +15,7 @@ public enum EventType { LMS( 10, ConfigManager.getString("EVENT.LMS.NAME"), - ClassImport.getClasses().getItemCreateUtil().createItem("&eLast Man Standing", Material.DIAMOND_SWORD), + ItemCreateUtil.createItem("&eLast Man Standing", Material.DIAMOND_SWORD), 15, LanguageManager.getString("COMMAND.EVENT.ARGUMENTS.LMS.BROADCAST"), ConfigManager.getList("EVENT.LMS.WINNER-COMMAND"), @@ -29,7 +29,7 @@ public enum EventType { OITC( 11, ConfigManager.getString("EVENT.OITC.NAME"), - ClassImport.getClasses().getItemCreateUtil().createItem("&6One In The Chamber", Material.BOW), + ItemCreateUtil.createItem("&6One In The Chamber", Material.BOW), 15, LanguageManager.getString("COMMAND.EVENT.ARGUMENTS.OITC.BROADCAST"), ConfigManager.getList("EVENT.OITC.WINNER-COMMAND"), @@ -43,7 +43,7 @@ public enum EventType { TNTTAG( 12, ConfigManager.getString("EVENT.TNTTAG.NAME"), - ClassImport.getClasses().getItemCreateUtil().createItem("&cTNT Tag", Material.TNT), + ItemCreateUtil.createItem("&cTNT Tag", Material.TNT), 15, LanguageManager.getString("COMMAND.EVENT.ARGUMENTS.TNTTAG.BROADCAST"), ConfigManager.getList("EVENT.TNTTAG.WINNER-COMMAND"), @@ -57,7 +57,7 @@ public enum EventType { BRACKETS( 13, ConfigManager.getString("EVENT.BRACKETS.NAME"), - ClassImport.getClasses().getItemCreateUtil().createItem("&aBrackets", Material.POTION, Short.valueOf("34")), + ItemCreateUtil.createItem("&aBrackets", Material.POTION, Short.valueOf("34")), 15, LanguageManager.getString("COMMAND.EVENT.ARGUMENTS.BRACKETS.BROADCAST"), ConfigManager.getList("EVENT.BRACKETS.WINNER-COMMAND"), @@ -71,7 +71,7 @@ public enum EventType { SUMO( 14, ConfigManager.getString("EVENT.SUMO.NAME"), - ClassImport.getClasses().getItemCreateUtil().createItem("&6Sumo", Material.STICK), + ItemCreateUtil.createItem("&6Sumo", Material.STICK), 15, LanguageManager.getString("COMMAND.EVENT.ARGUMENTS.SUMO.BROADCAST"), ConfigManager.getList("EVENT.SUMO.WINNER-COMMAND"), @@ -85,7 +85,7 @@ public enum EventType { SPLEGG( 15, ConfigManager.getString("EVENT.SPLEGG.NAME"), - ClassImport.getClasses().getItemCreateUtil().createItem("&bSplegg", Material.EGG), + ItemCreateUtil.createItem("&bSplegg", Material.EGG), 15, LanguageManager.getString("COMMAND.EVENT.ARGUMENTS.SPLEGG.BROADCAST"), ConfigManager.getList("EVENT.SPLEGG.WINNER-COMMAND"), @@ -99,7 +99,7 @@ public enum EventType { JUGGERNAUT( 16, ConfigManager.getString("EVENT.JUGGERNAUT.NAME"), - ClassImport.getClasses().getItemCreateUtil().createItem("&6Juggernaut", Material.GOLDEN_APPLE), + ItemCreateUtil.createItem("&6Juggernaut", Material.GOLDEN_APPLE), 15, LanguageManager.getString("COMMAND.EVENT.ARGUMENTS.JUGGERNAUT.BROADCAST"), ConfigManager.getList("EVENT.JUGGERNAUT.WINNER-COMMAND"), diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsData.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsData.java index baa628e61..752e3b5e5 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsData.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsData.java @@ -2,8 +2,7 @@ import dev.nandi0813.practice.manager.fight.event.enums.EventType; import dev.nandi0813.practice.manager.fight.event.events.duel.interfaces.DuelEventData; -import dev.nandi0813.practice.module.interfaces.KitData; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.util.KitData; import lombok.Getter; import java.io.IOException; @@ -15,7 +14,7 @@ public class BracketsData extends DuelEventData { public BracketsData() { super(EventType.BRACKETS); - this.kitData = ClassImport.createKitData(); + this.kitData = new KitData(); } @Override diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsListener.java index 93208fd09..f8367fef0 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/brackets/BracketsListener.java @@ -1,15 +1,18 @@ package dev.nandi0813.practice.manager.fight.event.events.duel.brackets; +import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.fight.event.enums.EventStatus; import dev.nandi0813.practice.manager.fight.event.events.duel.interfaces.DuelFight; import dev.nandi0813.practice.manager.fight.event.events.duel.interfaces.DuelListener; import dev.nandi0813.practice.manager.fight.event.interfaces.Event; -import dev.nandi0813.practice.module.util.ClassImport; +import org.bukkit.attribute.Attribute; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.player.PlayerEggThrowEvent; +import java.util.Objects; + public class BracketsListener extends DuelListener { @Override @@ -34,7 +37,7 @@ public void onEntityDamage(Event event, EntityDamageEvent e) { if (player.getHealth() - e.getFinalDamage() <= 0) { e.setDamage(0); - player.setHealth(player.getMaxHealth()); + player.setHealth(Objects.requireNonNull(player.getAttribute(Attribute.MAX_HEALTH)).getValue()); brackets.killPlayer(player, true); } @@ -55,13 +58,13 @@ public void onProjectileLaunch(Event event, ProjectileLaunchEvent e) { for (Player eventPlayer : brackets.getPlayers()) { if (duelFight.getPlayers().contains(eventPlayer)) return; - ClassImport.getClasses().getEntityHider().hideEntity(eventPlayer, e.getEntity()); + ZonePractice.getEntityHider().hideEntity(eventPlayer, e.getEntity()); } for (Player eventSpectator : brackets.getSpectators()) { if (duelFight.getSpectators().contains(eventSpectator)) return; - ClassImport.getClasses().getEntityHider().hideEntity(eventSpectator, e.getEntity()); + ZonePractice.getEntityHider().hideEntity(eventSpectator, e.getEntity()); } } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/interfaces/DuelEvent.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/interfaces/DuelEvent.java index 168bdf557..79d3e3ea9 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/interfaces/DuelEvent.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/duel/interfaces/DuelEvent.java @@ -10,6 +10,9 @@ import dev.nandi0813.practice.manager.fight.event.runnables.StartRunnable; import dev.nandi0813.practice.manager.fight.event.util.EventUtil; import dev.nandi0813.practice.manager.server.ServerManager; +import dev.nandi0813.practice.manager.server.sound.SoundEffect; +import dev.nandi0813.practice.manager.server.sound.SoundManager; +import dev.nandi0813.practice.manager.server.sound.SoundType; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.entityhider.PlayerHider; import dev.nandi0813.practice.util.playerutil.PlayerUtil; @@ -120,6 +123,9 @@ public void handleStartRunnable(StartRunnable startRunnable) { .replace("%seconds%", String.valueOf(seconds)) .replace("%secondName%", (seconds == 1 ? LanguageManager.getString("SECOND-NAME.1SEC") : LanguageManager.getString("SECOND-NAME.1 breakableMaterials = Collections.singletonList("WOOL"); public SpleggData() { super(EventType.SPLEGG); @@ -26,6 +31,28 @@ protected void setCustomData() { @Override protected void getCustomData() { this.eggLauncher = ConfigManager.getGuiItem("EVENT.SPLEGG.EGG-LAUNCHER-ITEM").get(); + + List configuredMaterials = ConfigManager.getConfig().getStringList("EVENT.SPLEGG.BREAKABLE-MATERIALS"); + if (configuredMaterials.isEmpty()) { + this.breakableMaterials = Collections.singletonList("WOOL"); + return; + } + + List normalizedMaterials = new ArrayList<>(); + for (String configuredMaterial : configuredMaterials) { + if (configuredMaterial == null) { + continue; + } + + String normalized = configuredMaterial.trim().toUpperCase(Locale.ROOT); + if (!normalized.isEmpty()) { + normalizedMaterials.add(normalized); + } + } + + this.breakableMaterials = normalizedMaterials.isEmpty() + ? Collections.singletonList("WOOL") + : normalizedMaterials; } @Override diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/ffa/splegg/SpleggListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/ffa/splegg/SpleggListener.java index de5e12fde..261fc1712 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/ffa/splegg/SpleggListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/ffa/splegg/SpleggListener.java @@ -3,8 +3,10 @@ import dev.nandi0813.practice.manager.fight.event.enums.EventStatus; import dev.nandi0813.practice.manager.fight.event.events.ffa.interfaces.FFAListener; import dev.nandi0813.practice.manager.fight.event.interfaces.Event; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.util.Cuboid; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Egg; @@ -19,6 +21,8 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockIterator; +import java.util.List; + public class SpleggListener extends FFAListener { @Override @@ -54,9 +58,9 @@ public void onPlayerMove(Event event, PlayerMoveEvent e) { event.killPlayer(player, false); } else { Material block = player.getLocation().getBlock().getType(); - if (block.equals(Material.WATER) || block.equals(ClassImport.getClasses().getItemMaterialUtil().getWater())) { + if (block.equals(Material.WATER)) { event.killPlayer(player, false); - } else if (block.equals(Material.LAVA) || block.equals(ClassImport.getClasses().getItemMaterialUtil().getLava())) { + } else if (block.equals(Material.LAVA)) { event.killPlayer(player, false); } } @@ -72,10 +76,10 @@ public void onPlayerInteract(Event event, PlayerInteractEvent e) { return; } - ItemStack item = ClassImport.getClasses().getPlayerUtil().getItemInUse(player, splegg.getEventData().getEggLauncher().getType()); + ItemStack item = PlayerUtil.getItemInUse(player, splegg.getEventData().getEggLauncher().getType()); if (item != null) { Egg egg = player.launchProjectile(Egg.class); - egg.setCustomName("SPLEGG"); + egg.customName(Component.text("SPLEGG")); splegg.getShotEggs().replace(player, splegg.getShotEggs().get(player) + 1); } } @@ -87,8 +91,7 @@ public void onPlayerEggThrow(Event event, PlayerEggThrowEvent e) { Player player = e.getPlayer(); Egg egg = e.getEgg(); - if (egg.getCustomName() == null) return; - if (!egg.getCustomName().equals("SPLEGG")) return; + if (!Component.text("SPLEGG").equals(egg.customName())) return; e.setHatching(false); e.setNumHatches((byte) 0); @@ -106,17 +109,35 @@ public void onPlayerEggThrow(Event event, PlayerEggThrowEvent e) { if (!event.getEventData().getCuboid().contains(hitBlock.getLocation())) return; Material hitBlockType = hitBlock.getType(); - String materialName = hitBlockType.name(); - // Check if block is wool - works for both 1.8.8 (WOOL) and modern versions (WHITE_WOOL, RED_WOOL, etc.) - if (materialName.equals("WOOL") || materialName.endsWith("_WOOL")) { - splegg.getFightChange().addBlockChange(ClassImport.createChangeBlock(hitBlock)); + if (!isBreakableMaterial(hitBlockType, splegg.getEventData().getBreakableMaterials())) return; + + splegg.getFightChange().addBlockChange(new ChangedBlock(hitBlock)); + hitBlock.setBlockData(Material.AIR.createBlockData()); + splegg.getShotBlocks().replace(player, splegg.getShotBlocks().get(player) + 1); + } + } + + private boolean isBreakableMaterial(Material blockType, List allowedMaterials) { + String materialName = blockType.name(); - hitBlock.setType(Material.AIR); - splegg.getShotBlocks().replace(player, splegg.getShotBlocks().get(player) + 1); + for (String allowedMaterial : allowedMaterials) { + if (allowedMaterial == null || allowedMaterial.isEmpty()) { + continue; + } + + if (materialName.equals(allowedMaterial)) { + return true; + } + + if (materialName.contains("_") && materialName.endsWith("_" + allowedMaterial)) { + return true; } } + + return false; } + @Override public void onPlayerDropItem(Event event, PlayerDropItemEvent e) { if (event instanceof Splegg) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/Juggernaut.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/Juggernaut.java index 0b4868db7..4ff7e56f0 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/Juggernaut.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/Juggernaut.java @@ -6,7 +6,7 @@ import dev.nandi0813.practice.manager.fight.event.enums.EventStatus; import dev.nandi0813.practice.manager.fight.event.events.ffa.interfaces.FFAEvent; import dev.nandi0813.practice.manager.server.ServerManager; -import dev.nandi0813.practice.module.interfaces.KitData; +import dev.nandi0813.practice.util.KitData; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/JuggernautData.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/JuggernautData.java index 7235f0a68..edc7333a4 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/JuggernautData.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/juggernaut/JuggernautData.java @@ -2,8 +2,7 @@ import dev.nandi0813.practice.manager.fight.event.enums.EventType; import dev.nandi0813.practice.manager.fight.event.interfaces.EventData; -import dev.nandi0813.practice.module.interfaces.KitData; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.util.KitData; import lombok.Getter; import java.io.IOException; @@ -11,8 +10,8 @@ @Getter public class JuggernautData extends EventData { - private final KitData juggernautKitData = ClassImport.createKitData(); - private final KitData playerKitData = ClassImport.createKitData(); + private final KitData juggernautKitData = new KitData(); + private final KitData playerKitData = new KitData(); public JuggernautData() { super(EventType.JUGGERNAUT); @@ -24,9 +23,7 @@ protected void setCustomData() { juggernautKitData.saveData(this.config, "juggernaut-kit"); } - if (playerKitData != null) { - playerKitData.saveData(this.config, "player-kit"); - } + playerKitData.saveData(this.config, "player-kit"); } @Override diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/tnttag/TNTTag.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/tnttag/TNTTag.java index bbccbd67e..3991943f3 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/tnttag/TNTTag.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/events/onevsall/tnttag/TNTTag.java @@ -11,7 +11,11 @@ import dev.nandi0813.practice.manager.fight.event.runnables.DurationRunnable; import dev.nandi0813.practice.manager.fight.event.runnables.StartRunnable; import dev.nandi0813.practice.manager.fight.event.util.EventUtil; +import dev.nandi0813.practice.manager.fight.util.BlockUtil; import dev.nandi0813.practice.manager.server.ServerManager; +import dev.nandi0813.practice.manager.server.sound.SoundEffect; +import dev.nandi0813.practice.manager.server.sound.SoundManager; +import dev.nandi0813.practice.manager.server.sound.SoundType; import dev.nandi0813.practice.util.entityhider.PlayerHider; import dev.nandi0813.practice.util.playerutil.PlayerUtil; import lombok.Getter; @@ -24,7 +28,6 @@ import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -114,6 +117,9 @@ public void handleStartRunnable(StartRunnable startRunnable) { .replace("%seconds%", String.valueOf(seconds)) .replace("%secondName%", (seconds == 1 ? LanguageManager.getString("SECOND-NAME.1SEC") : LanguageManager.getString("SECOND-NAME.1 getActivePlayerList() { + return this.players; + } + public abstract StartRunnable getStartRunnable(); public abstract DurationRunnable getDurationRunnable(); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/interfaces/EventData.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/interfaces/EventData.java index 5c8a0163e..9d1ab58c3 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/interfaces/EventData.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/interfaces/EventData.java @@ -1,6 +1,5 @@ package dev.nandi0813.practice.manager.fight.event.interfaces; -import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.ConfigFile; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.event.EventManager; @@ -11,7 +10,6 @@ import lombok.Setter; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.scheduler.BukkitRunnable; import java.io.IOException; import java.util.ArrayList; @@ -21,8 +19,6 @@ @Setter public abstract class EventData extends ConfigFile { - private static final ZonePractice practice = ZonePractice.getInstance(); - protected EventType type; protected boolean enabled; protected GUIItem icon; @@ -58,45 +54,32 @@ public EventData(final EventType type) { } @Override - public void setData() { - BukkitRunnable task = new BukkitRunnable() { - @Override - public void run() { - config.set("enabled", enabled); - config.set("icon", icon.get()); - config.set("settings.broadcastInterval", broadcastInterval); - config.set("settings.waitBeforeStart", waitBeforeStart); - config.set("settings.maxQueueTime", maxQueueTime); - config.set("settings.duration", duration); - config.set("settings.startTime", startTime); - config.set("settings.minPlayer", minPlayer); - config.set("settings.maxPlayer", maxPlayer); - - if (cuboidLoc1 != null) - config.set("cuboid.1", cuboidLoc1); - if (cuboidLoc2 != null) - config.set("cuboid.2", cuboidLoc2); - - if (!spawns.isEmpty()) { - config.set("spawns", spawns); - } - - setCustomData(); - - saveFile(); - } - }; - - if (practice.isEnabled()) - task.runTaskAsynchronously(practice); - else - task.run(); + public synchronized void setData() { + config.set("enabled", enabled); + config.set("icon", icon.get()); + config.set("settings.broadcastInterval", broadcastInterval); + config.set("settings.waitBeforeStart", waitBeforeStart); + config.set("settings.maxQueueTime", maxQueueTime); + config.set("settings.duration", duration); + config.set("settings.startTime", startTime); + config.set("settings.minPlayer", minPlayer); + config.set("settings.maxPlayer", maxPlayer); + + config.set("cuboid.1", cuboidLoc1); + config.set("cuboid.2", cuboidLoc2); + config.set("spawns", spawns.isEmpty() ? null : new ArrayList<>(spawns)); + + setCustomData(); + + saveFile(); } protected abstract void setCustomData(); @Override public void getData() { + spawns.clear(); + if (config.isItemStack("icon")) this.icon = new GUIItem(config.getItemStack("icon")); @@ -127,9 +110,16 @@ public void getData() { this.setCuboidLoc2((Location) config.get("cuboid.2")); if (config.isList("spawns")) { - for (Object obj : config.getList("spawns")) { - if (obj instanceof Location) { - addSpawn((Location) obj); + List savedSpawns = config.getList("spawns"); + if (savedSpawns != null) { + for (Object obj : savedSpawns) { + if (obj instanceof Location location) { + spawns.add(location.clone()); + } + } + + if (cuboid != null) { + spawns.removeIf(spawn -> !cuboid.contains(spawn)); } } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/runnables/StartRunnable.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/runnables/StartRunnable.java index 0a33d31ca..8c4e557cd 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/runnables/StartRunnable.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/runnables/StartRunnable.java @@ -1,9 +1,6 @@ package dev.nandi0813.practice.manager.fight.event.runnables; import dev.nandi0813.practice.manager.fight.event.interfaces.Event; -import dev.nandi0813.practice.manager.server.sound.SoundEffect; -import dev.nandi0813.practice.manager.server.sound.SoundManager; -import dev.nandi0813.practice.manager.server.sound.SoundType; import dev.nandi0813.practice.util.interfaces.Runnable; public class StartRunnable extends Runnable { @@ -18,11 +15,6 @@ public StartRunnable(final Event event) { @Override public void run() { - if (this.seconds > 0) { - SoundEffect sound = SoundManager.getInstance().getSound(SoundType.EVENT_START_COUNTDOWN); - if (sound != null) sound.play(this.event.getPlayers()); - } - this.event.handleStartRunnable(this); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSetupListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSetupListener.java index ad81898a6..f5b5bd908 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSetupListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSetupListener.java @@ -1,16 +1,18 @@ package dev.nandi0813.practice.manager.fight.event.setup; import dev.nandi0813.api.Event.Event.EventEndEvent; +import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.util.ArenaWorldUtil; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.event.interfaces.EventData; +import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.gui.setup.event.EventSetupManager; import dev.nandi0813.practice.util.Common; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Mannequin; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -18,12 +20,9 @@ import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.player.*; +import org.bukkit.inventory.EquipmentSlot; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; public class EventSetupListener implements Listener { @@ -36,6 +35,8 @@ public class EventSetupListener implements Listener { * processed this tick and skip any duplicate invocation within the same tick. */ private final Set interactCooldown = new HashSet<>(); + private final Set entityInteractCooldown = new HashSet<>(); + private final Set markerDamageCooldown = new HashSet<>(); public EventSetupListener(EventWandSetupManager setupManager) { this.setupManager = setupManager; @@ -43,6 +44,10 @@ public EventSetupListener(EventWandSetupManager setupManager) { @EventHandler public void onInteract(PlayerInteractEvent event) { + if (event.getHand() != EquipmentSlot.HAND) { + return; + } + Player player = event.getPlayer(); if (!setupManager.isSettingUp(player) || !setupManager.isSetupWand(event.getItem())) { @@ -74,7 +79,7 @@ public void onInteract(PlayerInteractEvent event) { Action action = event.getAction(); if (player.isSneaking()) { - handleModeSwitch(player, session, eventData, action); + handleModeSwitch(player, session, action); return; } @@ -118,61 +123,94 @@ public void onPlayerDropItem(PlayerDropItemEvent e) { } } + @EventHandler + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + if (event.getHand() != EquipmentSlot.HAND) { + return; + } + + Player player = event.getPlayer(); + if (!setupManager.isSettingUp(player) || !setupManager.isSetupWand(player.getInventory().getItemInMainHand())) { + return; + } + + if (event.getRightClicked() instanceof Mannequin mannequin && EventSpawnMarkerManager.getInstance().isMarker(mannequin)) { + event.setCancelled(true); + } + } + @EventHandler public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) { + if (event.getHand() != EquipmentSlot.HAND) { + return; + } + Player player = event.getPlayer(); - if (!setupManager.isSettingUp(player) || !setupManager.isSetupWand(player.getItemInHand())) { + if (!setupManager.isSettingUp(player) || !setupManager.isSetupWand(player.getInventory().getItemInMainHand())) { return; } + if (!entityInteractCooldown.add(player.getUniqueId())) { + return; + } + org.bukkit.Bukkit.getScheduler().runTask( + ZonePractice.getInstance(), + () -> entityInteractCooldown.remove(player.getUniqueId()) + ); + EventWandSetupManager.SetupSession session = setupManager.getSession(player); + if (session == null) { + return; + } + if (session.getCurrentMode() != EventSetupMode.SPAWN_POINTS) { return; } - if (!(event.getRightClicked() instanceof ArmorStand armorStand)) { + if (!(event.getRightClicked() instanceof Mannequin mannequin)) { return; } event.setCancelled(true); EventData eventData = session.getEventData(); + if (eventData == null) { + return; + } + EventSpawnMarkerManager markerManager = EventSpawnMarkerManager.getInstance(); - if (!markerManager.isMarker(armorStand)) { + if (!markerManager.isMarker(mannequin)) { return; } - int spawnIndex = markerManager.getSpawnIndex(armorStand, eventData); - if (spawnIndex == -1) { - player.sendMessage(Common.colorize("&cCouldn't find spawn point for this marker.")); + if (!markerManager.isSpawnMarker(mannequin)) { + return; + } + + int spawnIndex = markerManager.getSpawnIndex(mannequin); + if (spawnIndex < 0 || spawnIndex >= eventData.getSpawns().size()) { + markerManager.updateMarkers(eventData); + updateGui(eventData); + player.sendMessage(Common.colorize("&cThis spawn marker is outdated. Markers have been refreshed.")); return; } eventData.getSpawns().remove(spawnIndex); markerManager.updateMarkers(eventData); updateGui(eventData); + scheduleSave(eventData); player.sendMessage(Common.colorize("&aRemoved spawn point #" + (spawnIndex + 1) + ". Remaining: " + eventData.getSpawns().size())); } - // Prevent players from manipulating marker armor stands - @EventHandler(priority = EventPriority.HIGHEST) - public void onArmorStandManipulate(PlayerArmorStandManipulateEvent event) { - ArmorStand armorStand = event.getRightClicked(); - - if (EventSpawnMarkerManager.getInstance().isMarker(armorStand)) { - event.setCancelled(true); - } - } - - // Prevent damage to marker armor stands + // Prevent damage to marker mannequins @EventHandler(priority = EventPriority.HIGHEST) - public void onArmorStandDamage(EntityDamageByEntityEvent event) { - if (!(event.getEntity() instanceof ArmorStand armorStand)) return; + public void onMarkerDamage(EntityDamageByEntityEvent event) { + if (!(event.getEntity() instanceof Mannequin mannequin)) return; - if (!EventSpawnMarkerManager.getInstance().isMarker(armorStand)) return; + if (!EventSpawnMarkerManager.getInstance().isMarker(mannequin)) return; // Cancel damage in all cases event.setCancelled(true); @@ -180,6 +218,13 @@ public void onArmorStandDamage(EntityDamageByEntityEvent event) { // Check if the damager is a player (left-click) if (!(event.getDamager() instanceof Player player)) return; + // Some client/server combos can emit duplicate damage callbacks for one swing. + if (!markerDamageCooldown.add(player.getUniqueId())) return; + org.bukkit.Bukkit.getScheduler().runTask( + ZonePractice.getInstance(), + () -> markerDamageCooldown.remove(player.getUniqueId()) + ); + // Check if player is in setup mode if (!setupManager.isSettingUp(player)) return; @@ -192,12 +237,13 @@ public void onArmorStandDamage(EntityDamageByEntityEvent event) { // Check if in correct mode if (session.getCurrentMode() != EventSetupMode.SPAWN_POINTS) return; - // Left-click on armor stand = Remove last spawn (same as left-click on block) + // Left-click on mannequin marker = Remove last spawn (same as left-click on block) if (!eventData.getSpawns().isEmpty()) { int index = eventData.getSpawns().size() - 1; eventData.getSpawns().remove(index); EventSpawnMarkerManager.getInstance().updateMarkers(eventData); updateGui(eventData); + scheduleSave(eventData); player.sendMessage(Common.colorize("&cRemoved last spawn point. Remaining: " + index)); } else { player.sendMessage(Common.colorize("&cNo spawn points to remove.")); @@ -216,7 +262,7 @@ public void onEventEnd(EventEndEvent event) { } } - private void handleModeSwitch(Player player, EventWandSetupManager.SetupSession session, EventData eventData, Action action) { + private void handleModeSwitch(Player player, EventWandSetupManager.SetupSession session, Action action) { if (action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK) { session.setCurrentMode(setupManager.getNextMode(session.getCurrentMode())); } else if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) { @@ -257,6 +303,7 @@ private void handleCornerSelection(Player player, EventData eventData, Action ac } updateGui(eventData); + scheduleSave(eventData); } private void handleSpawnPoints(Player player, EventData eventData, Action action, PlayerInteractEvent event) { @@ -282,9 +329,17 @@ private void handleSpawnPoints(Player player, EventData eventData, Action action return; } - eventData.addSpawn(spawnLoc); + try { + eventData.addSpawn(spawnLoc); + } catch (IllegalStateException ex) { + // Ignore duplicate/invalid add attempts and show the setup error to the player. + player.sendMessage(Common.colorize("&c" + ex.getMessage())); + return; + } + EventSpawnMarkerManager.getInstance().updateMarkers(eventData); updateGui(eventData); + scheduleSave(eventData); player.sendMessage(Common.colorize("&aAdded spawn point #" + eventData.getSpawns().size() + " at your location.")); } @@ -295,6 +350,7 @@ else if (action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK) { eventData.getSpawns().remove(index); EventSpawnMarkerManager.getInstance().updateMarkers(eventData); updateGui(eventData); + scheduleSave(eventData); player.sendMessage(Common.colorize("&cRemoved last spawn point. Remaining: " + index)); } else { player.sendMessage(Common.colorize("&cNo spawn points to remove.")); @@ -332,6 +388,7 @@ private void handleToggleStatus(Player player, EventData eventData, Action actio } updateGui(eventData); + scheduleSave(eventData); } catch (Exception e) { player.sendMessage(Common.colorize("&cError toggling status: " + e.getMessage())); } @@ -342,6 +399,7 @@ private void updateGui(EventData eventData) { if (EventSetupManager.getInstance().getEventSetupGUIs().get(eventData).containsKey(GUIType.Event_Main)) { EventSetupManager.getInstance().getEventSetupGUIs().get(eventData).get(GUIType.Event_Main).update(); } + GUIManager.getInstance().getGuis().get(GUIType.Event_Summary).update(); } } @@ -352,4 +410,8 @@ private static Location getSnappedLocation(org.bukkit.block.Block clickedBlock, loc.setPitch(0.0f); return loc; } + + private static void scheduleSave(EventData eventData) { + org.bukkit.Bukkit.getScheduler().runTaskAsynchronously(ZonePractice.getInstance(), eventData::setData); + } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSpawnMarkerManager.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSpawnMarkerManager.java index 9fa0af860..2b8156d6f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSpawnMarkerManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventSpawnMarkerManager.java @@ -1,19 +1,22 @@ package dev.nandi0813.practice.manager.fight.event.setup; +import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.fight.event.interfaces.EventData; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.ItemCreateUtil; import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Mannequin; import org.bukkit.inventory.ItemStack; import java.util.*; /** - * Manages armor stand markers that show spawn positions in event setup mode. - * Armor stands face the direction the player will spawn and hold a sword. + * Manages mannequin markers that show spawn positions in event setup mode. + * Mannequins face the direction the player will spawn and hold a sword. */ @Getter public class EventSpawnMarkerManager { @@ -27,10 +30,10 @@ public static EventSpawnMarkerManager getInstance() { return instance; } - // Maps each event to its list of marker armor stands - private final Map> eventMarkers = new HashMap<>(); + // Maps each event to its list of marker mannequins + private final Map> eventMarkers = new HashMap<>(); - // Maps armor stand UUID to spawn index for spawn removal + // Maps mannequin UUID to spawn index for spawn removal private final Map markerToSpawnIndex = new HashMap<>(); /** @@ -42,42 +45,43 @@ public void showMarkers(EventData eventData) { // Clear existing markers first clearMarkers(eventData); - // Additionally, clear any orphaned armor stands near spawn locations that might have been left behind + // Additionally, clear any orphaned mannequins near spawn locations that might have been left behind // This prevents duplicates from previous sessions or crashes if (eventData.getSpawns() != null && !eventData.getSpawns().isEmpty()) { for (Location spawnLoc : eventData.getSpawns()) { if (spawnLoc != null && spawnLoc.getWorld() != null) { - // Remove any nearby armor stands (within 3 blocks) to clean up orphans + // Remove any nearby mannequins (within 3 blocks) to clean up orphans spawnLoc.getWorld().getNearbyEntities(spawnLoc, 3, 3, 3).stream() - .filter(entity -> entity instanceof ArmorStand) + .filter(entity -> entity instanceof Mannequin) .forEach(entity -> { - ArmorStand stand = (ArmorStand) entity; - // Only remove armor stands that look like our markers - if (stand.getCustomName() != null && - (stand.getCustomName().contains("Spawn #") || - stand.getCustomName().contains("Right-click to remove"))) { - stand.remove(); + Mannequin mannequin = (Mannequin) entity; + String customName = mannequin.customName() == null ? null : Common.serializeComponentToLegacyString(mannequin.customName()); + // Only remove mannequins that look like our markers + if (customName != null && + (customName.contains("Spawn #") || + customName.contains("Right-click to remove"))) { + mannequin.remove(); } }); } } } - List markers = new ArrayList<>(); + List markers = new ArrayList<>(); List spawns = eventData.getSpawns(); if (!spawns.isEmpty()) { int index = 0; for (Location spawnLoc : spawns) { - ArmorStand marker = createMarker(spawnLoc, "&c&lSpawn #" + (index + 1)); + Mannequin marker = createMarker(spawnLoc, "&c&lSpawn #" + (index + 1)); if (marker != null) { markers.add(marker); // Track this main marker to its spawn index markerToSpawnIndex.put(marker.getUniqueId(), index); - // Create second armor stand above for instruction text + // Create second mannequin above for instruction text Location labelLoc = spawnLoc.clone().add(0, 2.3, 0); - ArmorStand labelStand = createLabelOnly(labelLoc, "&7(Right-click to remove)"); + Mannequin labelStand = createLabelOnly(labelLoc); if (labelStand != null) { markers.add(labelStand); } @@ -92,52 +96,62 @@ public void showMarkers(EventData eventData) { } /** - * Creates an armor stand marker at the specified location + * Creates a mannequin marker at the specified location */ - private ArmorStand createMarker(Location location, String name) { + private Mannequin createMarker(Location location, String name) { if (location == null || location.getWorld() == null) return null; - // Spawn armor stand at exact player spawn position + // Spawn mannequin at exact player spawn position Location markerLoc = location.clone(); - ArmorStand armorStand = (ArmorStand) markerLoc.getWorld().spawnEntity(markerLoc, EntityType.ARMOR_STAND); - - // Configure armor stand to look like a player - armorStand.setVisible(true); // Show body to represent player - armorStand.setGravity(false); - armorStand.setCanPickupItems(false); - armorStand.setCustomNameVisible(true); - armorStand.setCustomName(Common.colorize(name)); - - // Make the armor stand face the same direction (yaw) as the saved spawn location + Mannequin mannequin = (Mannequin) markerLoc.getWorld().spawnEntity(markerLoc, EntityType.MANNEQUIN); + + // Configure mannequin to look like a player marker while staying static. + mannequin.setInvisible(false); // Show body to represent player + mannequin.setGravity(false); + mannequin.setCanPickupItems(false); + mannequin.setCustomNameVisible(true); + mannequin.customName(Component.text(Common.colorize(name))); + mannequin.setAI(false); + mannequin.setCollidable(false); + mannequin.setSilent(true); + mannequin.setImmovable(true); + + // Make the mannequin face the same direction (yaw) as the saved spawn location Location facingLoc = markerLoc.clone(); facingLoc.setYaw(location.getYaw()); facingLoc.setPitch(0.0f); - armorStand.teleport(facingLoc); + mannequin.teleport(facingLoc); // Give it a sword to hold (to make it more visible) - ItemStack sword = ClassImport.getClasses().getItemCreateUtil().createItem("&cSpawn Marker", org.bukkit.Material.DIAMOND_SWORD); - armorStand.setItemInHand(sword); + ItemStack sword = ItemCreateUtil.createItem("&cSpawn Marker", org.bukkit.Material.DIAMOND_SWORD); + mannequin.getEquipment().setItemInMainHand(sword); - // Make it invulnerable and persistent - armorStand.setRemoveWhenFarAway(false); - armorStand.setMarker(false); + // Make it invulnerable and non-persistent. + mannequin.setInvulnerable(true); + mannequin.setPersistent(false); + mannequin.setRemoveWhenFarAway(false); - return armorStand; + return mannequin; } /** - * Creates a small invisible armor stand just for displaying text label + * Creates a small invisible mannequin just for displaying text label */ - private ArmorStand createLabelOnly(Location location, String text) { + private Mannequin createLabelOnly(Location location) { if (location == null || location.getWorld() == null) return null; - ArmorStand labelStand = (ArmorStand) location.getWorld().spawnEntity(location, EntityType.ARMOR_STAND); - labelStand.setVisible(false); + Mannequin labelStand = (Mannequin) location.getWorld().spawnEntity(location, EntityType.MANNEQUIN); + labelStand.setInvisible(true); labelStand.setGravity(false); labelStand.setCanPickupItems(false); labelStand.setCustomNameVisible(true); - labelStand.setCustomName(Common.colorize(text)); - labelStand.setMarker(true); // Make it small + labelStand.customName(Component.text(Common.colorize("&7(Right-click to remove)"))); + labelStand.setAI(false); + labelStand.setCollidable(false); + labelStand.setSilent(true); + labelStand.setImmovable(true); + labelStand.setInvulnerable(true); + labelStand.setPersistent(false); labelStand.setRemoveWhenFarAway(false); return labelStand; @@ -147,9 +161,9 @@ private ArmorStand createLabelOnly(Location location, String text) { * Clears all markers for a specific event */ public void clearMarkers(EventData eventData) { - List markers = eventMarkers.get(eventData); + List markers = eventMarkers.get(eventData); if (markers != null) { - for (ArmorStand marker : markers) { + for (Mannequin marker : markers) { markerToSpawnIndex.remove(marker.getUniqueId()); marker.remove(); } @@ -161,8 +175,8 @@ public void clearMarkers(EventData eventData) { * Clears all markers for all events */ public void clearAllMarkers() { - for (List markers : eventMarkers.values()) { - for (ArmorStand marker : markers) { + for (List markers : eventMarkers.values()) { + for (Mannequin marker : markers) { markerToSpawnIndex.remove(marker.getUniqueId()); marker.remove(); } @@ -174,24 +188,17 @@ public void clearAllMarkers() { * Updates markers for an event (re-creates them) */ public void updateMarkers(EventData eventData) { - // Always update markers - showMarkers will clear old ones first - // This ensures markers appear even when adding the first spawn point - showMarkers(eventData); - } - - /** - * Checks if markers are currently shown for an event - */ - public boolean hasMarkers(EventData eventData) { - return eventMarkers.containsKey(eventData) && !eventMarkers.get(eventData).isEmpty(); + clearMarkers(eventData); + // Recreate markers next tick so removed entities are fully despawned first. + Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> showMarkers(eventData)); } /** - * Checks if an armor stand is a spawn marker + * Checks if a mannequin is a spawn marker */ - public boolean isMarker(ArmorStand armorStand) { - for (List markers : eventMarkers.values()) { - if (markers.contains(armorStand)) { + public boolean isMarker(Mannequin mannequin) { + for (List markers : eventMarkers.values()) { + if (markers.contains(mannequin)) { return true; } } @@ -199,21 +206,16 @@ public boolean isMarker(ArmorStand armorStand) { } /** - * Finds which event a marker armor stand belongs to + * Checks if a mannequin is a removable spawn marker (not just a floating label). */ - public EventData findEventForMarker(ArmorStand armorStand) { - for (Map.Entry> entry : eventMarkers.entrySet()) { - if (entry.getValue().contains(armorStand)) { - return entry.getKey(); - } - } - return null; + public boolean isSpawnMarker(Mannequin mannequin) { + return markerToSpawnIndex.containsKey(mannequin.getUniqueId()); } /** - * Gets the spawn index for a given marker armor stand + * Gets the spawn index for a given marker mannequin */ - public int getSpawnIndex(ArmorStand armorStand, EventData eventData) { - return markerToSpawnIndex.getOrDefault(armorStand.getUniqueId(), -1); + public int getSpawnIndex(Mannequin mannequin) { + return markerToSpawnIndex.getOrDefault(mannequin.getUniqueId(), -1); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventWandSetupManager.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventWandSetupManager.java index 4c234dc40..4bee54170 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventWandSetupManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/event/setup/EventWandSetupManager.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class EventWandSetupManager { @@ -48,9 +49,9 @@ public SetupSession(EventData eventData) { private final Map setupSessions = new HashMap<>(); - public boolean startSetup(Player player, EventData eventData) { + public void startSetup(Player player, EventData eventData) { if (eventData.isEnabled()) { - return false; + return; } if (isSettingUp(player)) { @@ -80,7 +81,6 @@ public boolean startSetup(Player player, EventData eventData) { EventSpawnMarkerManager.getInstance().showMarkers(eventData); player.sendMessage(Common.colorize("&aSetup mode started for event: &e" + eventData.getType().getName() + "&a.")); - return true; } public void stopSetup(Player player) { @@ -125,7 +125,7 @@ public List getPlayersSettingUpEvent(EventData eventData) { } public boolean isSetupWand(ItemStack item) { - return item != null && item.getType() == Material.BLAZE_ROD && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().contains("Event Wand"); + return item != null && item.getType() == Material.BLAZE_ROD && item.hasItemMeta() && Common.getItemDisplayName(item).contains("Event Wand"); } public EventSetupMode getNextMode(EventSetupMode current) { @@ -153,7 +153,7 @@ public void updateWand(Player player) { ItemMeta meta = wand.getItemMeta(); EventSetupMode mode = session.getCurrentMode(); - meta.setDisplayName(Common.colorize("&6Event Wand &7(&e" + mode.getDisplayName() + "&7)")); + meta.displayName(Common.legacyToComponent(Common.colorize("&6Event Wand &7(&e" + mode.getDisplayName() + "&7)"))); List lore = new ArrayList<>(); lore.add(Common.colorize("&7Editing: &a" + eventData.getType().getName())); @@ -172,9 +172,9 @@ public void updateWand(Player player) { lore.add(""); lore.add(Common.colorize("&cDrop (Q): &7Exit Setup")); - meta.setLore(lore); + meta.lore(lore.stream().map(Common::legacyToComponent).collect(Collectors.toList())); wand.setItemMeta(meta); - player.getInventory().setItemInHand(wand); + player.getInventory().setItemInMainHand(wand); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAListener.java index ed13c3409..729bb69e1 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAListener.java @@ -2,41 +2,38 @@ import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.arenas.FFAArena; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.ffa.game.FFA; -import dev.nandi0813.practice.manager.fight.util.BlockUtil; -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import dev.nandi0813.practice.manager.fight.util.ListenerUtil; +import dev.nandi0813.practice.manager.fight.util.*; +import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.profile.Profile; +import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import dev.nandi0813.practice.util.NumberUtil; -import dev.nandi0813.practice.util.StringUtil; -import dev.nandi0813.practice.util.cooldown.CooldownObject; -import dev.nandi0813.practice.util.cooldown.PlayerCooldown; import dev.nandi0813.practice.util.fightmapchange.FightChangeOptimized; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.damage.DamageSource; +import org.bukkit.damage.DamageType; import org.bukkit.entity.Arrow; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityRegainHealthEvent; -import org.bukkit.event.entity.FoodLevelChangeEvent; -import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.entity.*; import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.scheduler.BukkitRunnable; import static dev.nandi0813.practice.util.PermanentConfig.FIGHT_ENTITY; import static dev.nandi0813.practice.util.PermanentConfig.PLACED_IN_FIGHT; @@ -45,11 +42,11 @@ * FFA-specific event listener. * *

Block tracking / rollback events (break, place, piston, liquid, explosion, etc.) - * are handled by the unified {@link dev.nandi0813.practice.manager.fight.listener.BuildBlockListener}. + * are handled by the unified {@link dev.nandi0813.practice.manager.fight.listener.BuildListener}. * This listener only handles player-specific FFA game logic (damage, movement, crafting, etc.) - * and the build validation gates (cancel the event before MONITOR fires for BuildBlockListener).

+ * and the build validation gates (cancel the event before MONITOR fires for BuildListener).

*/ -public abstract class FFAListener implements Listener { +public class FFAListener implements Listener { @EventHandler public void onRegen(EntityRegainHealthEvent e) { @@ -98,7 +95,7 @@ public void onPlayerInteract(PlayerInteractEvent e) { } if (clickedBlock.getType().equals(Material.CHEST) || clickedBlock.getType().equals(Material.TRAPPED_CHEST)) { if (!ffa.isBuild()) return; - ffa.getFightChange().addBlockChange(ClassImport.createChangeBlock(clickedBlock)); + ffa.getFightChange().addBlockChange(new ChangedBlock(clickedBlock)); } } } @@ -118,12 +115,7 @@ public void onGoldenHeadConsume(PlayerItemConsumeEvent e) { Ladder ladder = ffa.getPlayers().get(player); if (ladder.getGoldenAppleCooldown() < 1) return; - ClassImport.getClasses().getItemCooldownHandler().handleGoldenAppleFFA( - player, - ladder.getGoldenAppleCooldown(), - e, - "FFA.GAME.COOLDOWN.GOLDEN-APPLE" - ); + ModernItemCooldownHandler.handleGoldenApple(player, ladder.getGoldenAppleCooldown(), e); } @EventHandler @@ -143,12 +135,12 @@ public void onProjectileLaunch(ProjectileLaunchEvent e) { // ProjectileLaunch won't remove them on ground-hit, hide from players in // other arenas, and schedule a 5-minute vanilla-style self-removal. if (e.getEntity() instanceof Arrow arrow) { - arrow.setMetadata(FIGHT_ENTITY, new FixedMetadataValue(ZonePractice.getInstance(), ffa)); + BlockUtil.setMetadata(arrow, FIGHT_ENTITY, ffa); // Hide from every online player NOT in this FFA for (org.bukkit.entity.Player online : ZonePractice.getInstance().getServer().getOnlinePlayers()) { if (!ffa.getPlayers().containsKey(online) && !ffa.getSpectators().contains(online)) { - ClassImport.getClasses().getEntityHider().hideEntity(online, arrow); + ZonePractice.getEntityHider().hideEntity(online, arrow); } } } @@ -194,7 +186,7 @@ protected static void arrowDisplayHearth(Player shooter, Player target, double f /** * Validates FFA build rules (build enabled, build limits). - * Actual block tracking is done by {@link dev.nandi0813.practice.manager.fight.listener.BuildBlockListener}. + * Actual block tracking is done by {@link dev.nandi0813.practice.manager.fight.listener.BuildListener}. */ @EventHandler public void onBlockBreak(BlockBreakEvent e) { @@ -210,9 +202,9 @@ public void onBlockBreak(BlockBreakEvent e) { Block block = e.getBlock(); - // Blocks placed during the fight — allow breaking (tracking done by BuildBlockListener) - if (block.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = BlockUtil.getMetadata(block, PLACED_IN_FIGHT); + // Blocks placed during the fight — allow breaking (tracking done by BuildListener) + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { + Object mv = BlockUtil.getMetadata(block, PLACED_IN_FIGHT, Object.class); if (ListenerUtil.checkMetaData(mv)) { e.setCancelled(true); } @@ -230,7 +222,7 @@ public void onBlockBreak(BlockBreakEvent e) { if (ALLOW_DESTROYABLE_BLOCK) { NormalLadder ladder = ffa.getPlayers().get(player); if (ladder != null) { - if (ClassImport.getClasses().getArenaUtil().containsDestroyableBlock(ladder, block)) { + if (ArenaUtil.containsDestroyableBlock(ladder, block)) { BlockUtil.breakBlock(ffa, block); } } @@ -240,7 +232,7 @@ public void onBlockBreak(BlockBreakEvent e) { // natural arena block for rollback and allow the break. NormalLadder currentLadder = ffa.getPlayers().get(player); if (currentLadder != null && currentLadder.isBreakAllBlocks()) { - ffa.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(block)); + ffa.getFightChange().addArenaBlockChange(new ChangedBlock(block)); return; // do NOT cancel — let the break happen } @@ -249,7 +241,7 @@ public void onBlockBreak(BlockBreakEvent e) { /** * Validates FFA build rules (build enabled, arena boundary, build limits) and tags block. - * Actual tracking is done by {@link dev.nandi0813.practice.manager.fight.listener.BuildBlockListener}. + * Actual tracking is done by {@link dev.nandi0813.practice.manager.fight.listener.BuildListener}. */ @EventHandler public void onBlockPlace(BlockPlaceEvent e) { @@ -276,12 +268,12 @@ public void onBlockPlace(BlockPlaceEvent e) { Common.sendMMMessage(player, LanguageManager.getString("FFA.GAME.CANT-BUILD-OVER-LIMIT")); e.setCancelled(true); } - // Tagging and tracking handled by BuildBlockListener at MONITOR priority + // Tagging and tracking handled by BuildListener at MONITOR priority } /** * Validates FFA bucket rules and tags the target block. - * Actual tracking is done by {@link dev.nandi0813.practice.manager.fight.listener.BuildBlockListener}. + * Actual tracking is done by {@link dev.nandi0813.practice.manager.fight.listener.BuildListener}. */ @EventHandler public void onBucketEmpty(PlayerBucketEmptyEvent e) { @@ -302,7 +294,7 @@ public void onBucketEmpty(PlayerBucketEmptyEvent e) { return; } - if (block.getLocation().getY() >= ListenerUtil.getCalculatedBuildLimit(ffa.getArena())) { + if (block.getRelative(e.getBlockFace()).getLocation().getY() >= ListenerUtil.getCalculatedBuildLimit(ffa.getArena())) { Common.sendMMMessage(player, LanguageManager.getString("FFA.GAME.CANT-BUILD-OVER-LIMIT")); e.setCancelled(true); } @@ -346,13 +338,14 @@ public void onItemDrop(PlayerDropItemEvent e) { } @EventHandler - public void onItemPickup(PlayerPickupItemEvent e) { - Player player = e.getPlayer(); + public void onItemPickup(EntityPickupItemEvent e) { + if (!(e.getEntity() instanceof Player player)) return; + FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); if (ffa == null) return; // Prevent picking up items (e.g. arrows) that have been hidden from this player - if (!ClassImport.getClasses().getEntityHider().canSee(player, e.getItem())) { + if (!ZonePractice.getEntityHider().canSee(player, e.getItem())) { e.setCancelled(true); return; } @@ -360,5 +353,70 @@ public void onItemPickup(PlayerPickupItemEvent e) { e.setCancelled(false); } + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e) { + Player player = e.getPlayer(); + + Profile profile = ProfileManager.getInstance().getProfile(player); + if (profile == null) return; + + FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); + if (ffa == null) return; + + e.setCancelled(true); + + DamageSource damageSource = e.getDamageSource(); + + // Void deaths are already handled by onPlayerMove in the core FFAListener. + // Skip here to avoid sending the death message twice. + if (damageSource.getDamageType().equals(DamageType.OUT_OF_WORLD)) { + return; + } + + Player killer = null; + if (damageSource.getCausingEntity() instanceof Entity damageEntity) { + killer = FightUtil.getKiller(damageEntity); + } + + DeathCause cause = FightUtil.convert(damageSource.getDamageType()); + ffa.killPlayer(player, killer, cause.getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")); + + if (killer != null) { + Statistic statistic = ffa.getStatistics().get(killer); + statistic.setKills(statistic.getKills() + 1); + } + } + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { + if (!(e.getEntity() instanceof Player target)) { + return; + } + + Profile profile = ProfileManager.getInstance().getProfile(target); + if (profile == null) return; + + FFA ffa = FFAManager.getInstance().getFFAByPlayer(target); + if (ffa == null) return; + + // Resolve the attacker (direct hit or projectile shooter) + Player attacker = null; + if (e.getDamager() instanceof Player damager) { + attacker = damager; + } else if (e.getDamager() instanceof Projectile projectile) { + if (projectile.getShooter() instanceof Player shooter) { + attacker = shooter; + + if (projectile instanceof Arrow) { + arrowDisplayHearth(shooter, target, e.getFinalDamage()); + } + } + } + + // Record the attacker for void-kill attribution + if (attacker != null) { + ffa.recordAttack(target, attacker); + } + } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAManager.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAManager.java index 1a3727a58..8d72f41b1 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/FFAManager.java @@ -3,6 +3,8 @@ import dev.nandi0813.practice.manager.arena.ArenaManager; import dev.nandi0813.practice.manager.arena.arenas.FFAArena; import dev.nandi0813.practice.manager.fight.ffa.game.FFA; +import dev.nandi0813.practice.manager.fight.ffa.game.FFAArenaSelectorGui; +import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.spectator.SpectatorManager; import dev.nandi0813.practice.util.interfaces.Spectatable; import lombok.Getter; @@ -23,7 +25,11 @@ public static FFAManager getInstance() { return instance; } + private final FFAArenaSelectorGui arenaSelectorGui; + private FFAManager() { + this.arenaSelectorGui = new FFAArenaSelectorGui(); + GUIManager.getInstance().addGUI(this.arenaSelectorGui); } public List getOpenFFAs() { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/BuildRollback.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/BuildRollback.java index 174a80cea..53c5ffc69 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/BuildRollback.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/BuildRollback.java @@ -1,5 +1,6 @@ package dev.nandi0813.practice.manager.fight.ffa.game; +import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.util.fightmapchange.FightChangeOptimized; import dev.nandi0813.practice.util.interfaces.Runnable; @@ -40,7 +41,12 @@ public void cancel() { public void rollback() { this.seconds = ROLLBACK_SECONDS; - fightChange.rollback(300, 100); + + if (ZonePractice.getInstance().isEnabled()) { + fightChange.rollback(300, 100); + } else { + fightChange.quickRollback(); + } } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/FFA.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/FFA.java index 0bdfebcbd..50332bf07 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/FFA.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/FFA.java @@ -51,6 +51,13 @@ public class FFA implements Spectatable, dev.nandi0813.api.Interface.FFA { private boolean open; + /** Tracks the last player that dealt damage to another player, for void-kill attribution. */ + private final Map lastAttackerMap = new HashMap<>(); + /** Timestamp (ms) of the last attacker hit, keyed by victim UUID. */ + private final Map lastAttackerTime = new HashMap<>(); + /** How long (ms) a last-attacker is considered valid for void attribution. */ + private static final long LAST_ATTACKER_EXPIRY_MS = 4_000L; + public FFA(FFAArena arena) { this.arena = arena; this.build = arena.isBuild(); @@ -138,6 +145,15 @@ public void addPlayer(Player player, NormalLadder ladder) { SpectatorManager.getInstance().getSpectatorMenuGui().update(); } + public void changePlayerLadder(Player player, NormalLadder ladder) { + if (!players.containsKey(player) || ladder == null) + return; + + players.put(player, ladder); + PlayerUtil.setFightPlayer(player); + KitUtil.loadDefaultLadderKit(player, TeamEnum.FFA, ladder); + } + public void removePlayer(Player player) { if (!players.containsKey(player)) return; @@ -166,6 +182,19 @@ public void killPlayer(Player player, Player killer, String deathMessage) { if (!players.containsKey(player)) return; + // If no explicit killer and the death message is the plain void message, + // check whether a recent attacker should be credited instead. + if (killer == null) { + Player lastAttacker = getLastAttacker(player); + if (lastAttacker != null && deathMessage != null + && deathMessage.equals(dev.nandi0813.practice.manager.fight.util.DeathCause.VOID.getMessage())) { + killer = lastAttacker; + deathMessage = dev.nandi0813.practice.manager.fight.util.DeathCause.VOID_BY_PLAYER + .getMessage() + .replace("%killer%", killer.getName()); + } + } + fightPlayers.get(player).die(deathMessage, statistics.get(player)); fightPlayers.get(player).getProfile().getStats().getLadderStat(players.get(player)).increaseDeaths(); @@ -188,6 +217,32 @@ public void killPlayer(Player player, Player killer, String deathMessage) { } } + /** + * Records that {@code attacker} last hit {@code victim}. + * Called from damage listeners so void deaths can be attributed correctly. + */ + public void recordAttack(Player victim, Player attacker) { + if (victim == attacker) return; + + lastAttackerMap.put(victim.getUniqueId(), attacker.getUniqueId()); + lastAttackerTime.put(victim.getUniqueId(), System.currentTimeMillis()); + } + + /** + * Returns the last player who hit {@code victim} within the expiry window, + * or {@code null} if there is none. + */ + public @org.jetbrains.annotations.Nullable Player getLastAttacker(Player victim) { + Long time = lastAttackerTime.get(victim.getUniqueId()); + if (time == null || System.currentTimeMillis() - time > LAST_ATTACKER_EXPIRY_MS) return null; + UUID attackerUuid = lastAttackerMap.get(victim.getUniqueId()); + if (attackerUuid == null) return null; + for (Player p : players.keySet()) { + if (attackerUuid.equals(p.getUniqueId())) return p; + } + return null; + } + public void teleportPlayer(Player player) { player.teleport(arena.getFfaPositions().get(random.nextInt(arena.getFfaPositions().size()))); } @@ -222,6 +277,12 @@ public void addSpectator(Player player, Player target, boolean teleport, boolean return; } + // If the spectator was spectating another match/FFA, remove them first. + Spectatable previousSpectatable = SpectatorManager.getInstance().getSpectators().get(player); + if (previousSpectatable != null) { + previousSpectatable.removeSpectator(player); + } + Profile profile = ProfileManager.getInstance().getProfile(player); this.spectators.add(player); @@ -291,13 +352,18 @@ public void removeSpectator(Player player) { public GUIItem getSpectatorMenuItem() { return GUIFile.getGuiItem("GUIS.SPECTATOR-MENU.ICONS.FFA-ICON") .setMaterial(arena.getIcon().getType()) - .setDamage(arena.getIcon().getDurability()) + .setDamage(Common.getItemDamage(arena.getIcon())) .replace("%players%", String.valueOf(players.size())) .replace("%spectators%", String.valueOf(spectators.size())) .replace("%arena%", arena.getDisplayName()) .replace("%build_status%", arena.isBuild() ? BUILD_ON : BUILD_OFF); } + @Override + public List getActivePlayerList() { + return new ArrayList<>(players.keySet()); + } + @Override public boolean canDisplay() { return this.open; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/FFAArenaSelectorGui.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/FFAArenaSelectorGui.java new file mode 100644 index 000000000..63abe2b9e --- /dev/null +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/FFAArenaSelectorGui.java @@ -0,0 +1,126 @@ +package dev.nandi0813.practice.manager.fight.ffa.game; + +import dev.nandi0813.practice.manager.arena.ArenaManager; +import dev.nandi0813.practice.manager.arena.arenas.FFAArena; +import dev.nandi0813.practice.manager.backend.GUIFile; +import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.gui.GUI; +import dev.nandi0813.practice.manager.gui.GUIItem; +import dev.nandi0813.practice.manager.gui.GUIType; +import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; +import dev.nandi0813.practice.manager.profile.Profile; +import dev.nandi0813.practice.manager.profile.ProfileManager; +import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; +import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.InventoryUtil; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class FFAArenaSelectorGui extends GUI { + + private static final String BUILD_ON = GUIFile.getString("GUIS.FFA.ARENA-SELECTOR.ICONS.ARENA.BUILD-STATUS.ENABLED"); + private static final String BUILD_OFF = GUIFile.getString("GUIS.FFA.ARENA-SELECTOR.ICONS.ARENA.BUILD-STATUS.DISABLED"); + private static final GUIItem ARENA_ITEM = GUIFile.getGuiItem("GUIS.FFA.ARENA-SELECTOR.ICONS.ARENA"); + private static final ItemStack FILLER_ITEM = GUIFile.getGuiItem("GUIS.FFA.ARENA-SELECTOR.ICONS.FILLER").get(); + + private final Map arenaSlots = new HashMap<>(); + + public FFAArenaSelectorGui() { + super(GUIType.FFA_Arena_Selector); + + int rows = Math.max(1, GUIFile.getInt("GUIS.FFA.ARENA-SELECTOR.ROWS")); + this.gui.put(1, InventoryUtil.createInventory(GUIFile.getString("GUIS.FFA.ARENA-SELECTOR.TITLE"), rows)); + } + + @Override + public void build() { + update(); + } + + @Override + public void update() { + Inventory inventory = gui.get(1); + inventory.clear(); + arenaSlots.clear(); + + List openArenas = ArenaManager.getInstance().getFFAArenas().stream() + .filter(arena -> arena.isEnabled() && arena.getFfa() != null && arena.getFfa().isOpen()) + .toList(); + + for (FFAArena arena : openArenas) { + FFA ffa = arena.getFfa(); + + GUIItem guiItem = ARENA_ITEM.cloneItem() + .replace("%arena%", arena.getDisplayName()) + .replace("%players%", String.valueOf(ffa.getPlayers().size())) + .replace("%build_status%", arena.isBuild() ? BUILD_ON : BUILD_OFF) + .replace("%rekit_after_kill%", arena.isReKitAfterKill() ? BUILD_ON : BUILD_OFF) + .replace("%lobby_after_death%", arena.isLobbyAfterDeath() ? BUILD_ON : BUILD_OFF) + .replace("%ladders%", String.valueOf(arena.getAssignedLadders().size())); + + if (arena.getIcon() != null) { + guiItem.setBaseItem(arena.getIcon()); + } + + int slot = inventory.firstEmpty(); + if (slot == -1) break; + + inventory.setItem(slot, guiItem.get()); + arenaSlots.put(slot, arena); + } + + for (int i = 0; i < inventory.getSize(); i++) { + if (inventory.getItem(i) == null) { + inventory.setItem(i, FILLER_ITEM); + } + } + + this.updatePlayers(); + } + + @Override + public void handleClickEvent(InventoryClickEvent e) { + e.setCancelled(true); + + Player player = (Player) e.getWhoClicked(); + int slot = e.getSlot(); + + if (!arenaSlots.containsKey(slot)) return; + + FFAArena arena = arenaSlots.get(slot); + if (arena == null) return; + + Profile profile = ProfileManager.getInstance().getProfile(player); + if (!profile.getStatus().equals(ProfileStatus.LOBBY)) { + player.closeInventory(); + return; + } + + FFA ffa = arena.getFfa(); + if (ffa == null || !ffa.isOpen()) { + Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.JOIN.ARENA-CLOSED").replace("%arena%", arena.getDisplayName())); + player.closeInventory(); + return; + } + + // If the arena has only one ladder, join directly + if (arena.getAssignedLadders().size() == 1) { + NormalLadder ladder = arena.getAssignedLadders().iterator().next(); + player.closeInventory(); + ffa.addPlayer(player, ladder); + } else { + // Open the ladder selector for this arena + ffa.getLadderSelectorGui().update(); + ffa.getLadderSelectorGui().open(player); + } + } + +} + diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/LadderSelector.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/LadderSelector.java index 2efc232cd..30949a53f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/LadderSelector.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/ffa/game/LadderSelector.java @@ -6,6 +6,7 @@ import dev.nandi0813.practice.manager.gui.GUI; import dev.nandi0813.practice.manager.gui.GUIItem; import dev.nandi0813.practice.manager.gui.GUIType; +import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; @@ -86,14 +87,17 @@ public void handleClickEvent(InventoryClickEvent e) { return; NormalLadder ladder = ladderSlots.get(slot); - if (ladder != null) { - if (!ladder.isEnabled() || !ffaArena.getAssignedLadders().contains(ladder)) { - update(); - return; - } else if (ladder.isFrozen()) { - update(); - return; - } + if (ladder == null) { + update(); + return; + } + + if (!ladder.isEnabled() || !ffaArena.getAssignedLadders().contains(ladder)) { + update(); + return; + } else if (ladder.isFrozen()) { + update(); + return; } if (!ffa.isOpen()) { @@ -102,7 +106,19 @@ public void handleClickEvent(InventoryClickEvent e) { return; } - ffa.addPlayer(player, ladder); + if (ffa.getPlayers().containsKey(player)) { + Ladder oldLadder = ffa.getPlayers().get(player); + if (oldLadder == ladder) { + Common.sendMMMessage(player, LanguageManager.getString("FFA.COMMAND.KIT.ALREADY-IN-KIT").replace("%ladder%", ladder.getDisplayName())); + return; + } + + ffa.changePlayerLadder(player, ladder); + } else { + ffa.addPlayer(player, ladder); + } + + player.closeInventory(); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/BuildBlockListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/BuildBlockListener.java deleted file mode 100644 index 479e22a6c..000000000 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/BuildBlockListener.java +++ /dev/null @@ -1,122 +0,0 @@ -package dev.nandi0813.practice.manager.fight.listener; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.util.BlockUtil; -import dev.nandi0813.practice.manager.fight.util.ListenerUtil; -import dev.nandi0813.practice.manager.fight.util.FightUtil; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.util.interfaces.Spectatable; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; - -import static dev.nandi0813.practice.util.PermanentConfig.PLACED_IN_FIGHT; - -/** - * Unified MONITOR-priority listener that tags and tracks player-initiated block changes - * (break and place) for all build-enabled {@link Spectatable} contexts. - *

- * Works for both {@link dev.nandi0813.practice.manager.fight.match.Match} and - * {@link dev.nandi0813.practice.manager.fight.ffa.game.FFA} — and any future type that - * implements {@link Spectatable} and is returned by - * {@link FightUtil#getActiveBuildSpectatables()}. - *

- * All world-driven block events (pistons, liquid flow, form, spread, explosions, TNT, - * falling blocks) are handled by the version-specific {@code MatchTntListener} which - * already covers all Spectatables via the same {@code getActiveBuildSpectatables()} helper. - */ -public class BuildBlockListener implements Listener { - - // ========== HELPERS ========== - - /** - * Finds the active build-enabled Spectatable whose cuboid contains the given block. - */ - private static Spectatable getByBlock(Block block) { - for (Spectatable s : FightUtil.getActiveBuildSpectatables()) { - if (s.getCuboid() != null && s.getCuboid().contains(block.getLocation())) { - return s; - } - } - return null; - } - - /** Track the block under a placed block if it will turn to dirt (grass → dirt). */ - private static void trackUnderBlockIfDirt(Block block, Spectatable spectatable) { - Block under = block.getLocation().subtract(0, 1, 0).getBlock(); - if (ClassImport.getClasses().getArenaUtil().turnsToDirt(under)) { - spectatable.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(under)); - } - } - - // ========== BLOCK BREAK ========== - - /** - * When a player breaks a block that was placed during the fight, track it for rollback. - * Runs at MONITOR so the validation listeners (FFAListener / LadderTypeListener) have - * already cancelled invalid breaks. Uses metadata to find the owning Spectatable — works - * for both Match and FFA without any type-specific branching. - *

- * Also handles destroyable blocks (beds, nexuses, etc.) that are natural arena blocks: - * these are detected by {@code containsDestroyableBlock} and processed via - * {@link BlockUtil#breakBlock} to trigger the game-mode-specific logic. - */ - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent e) { - Block block = e.getBlock(); - - // Case 1: block was placed during the fight — track it for rollback - if (block.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = BlockUtil.getMetadata(block, PLACED_IN_FIGHT); - if (ListenerUtil.checkMetaData(mv)) return; - if (!(mv.value() instanceof Spectatable spectatable)) return; - if (!spectatable.isBuild()) return; - - spectatable.addBlockChange(ClassImport.createChangeBlock(block)); - return; - } - - // Case 2: natural arena block — check if it is a destroyable block (bed, nexus, etc.) - Spectatable spectatable = getByBlock(block); - if (spectatable == null || !spectatable.isBuild()) return; - - var ladder = (spectatable instanceof Match match) ? match.getLadder() : null; - if (ClassImport.getClasses().getArenaUtil().containsDestroyableBlock(ladder, block)) { - BlockUtil.breakBlock(spectatable, block); - e.setCancelled(true); - } - } - - // ========== BLOCK PLACE ========== - - /** - * Tags a placed block with PLACED_IN_FIGHT metadata and tracks it for rollback. - * Runs at MONITOR so validation listeners have already cancelled invalid placements. - * Finds the owning Spectatable from cuboid lookup if not already tagged. - */ - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent e) { - Block block = e.getBlockPlaced(); - - Spectatable spectatable; - if (block.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = BlockUtil.getMetadata(block, PLACED_IN_FIGHT); - if (ListenerUtil.checkMetaData(mv) || !(mv.value() instanceof Spectatable s)) return; - spectatable = s; - } else { - spectatable = getByBlock(block); - if (spectatable == null || !spectatable.isBuild()) return; - block.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), spectatable)); - } - - spectatable.addBlockChange(ClassImport.createChangeBlock(e)); - trackUnderBlockIfDirt(block, spectatable); - } - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/AbstractBuildListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/BuildListener.java similarity index 63% rename from core/src/main/java/dev/nandi0813/practice/module/interfaces/AbstractBuildListener.java rename to core/src/main/java/dev/nandi0813/practice/manager/fight/listener/BuildListener.java index bf308a6f9..8ae0ae036 100644 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/AbstractBuildListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/BuildListener.java @@ -1,37 +1,39 @@ -package dev.nandi0813.practice.module.interfaces; +package dev.nandi0813.practice.manager.fight.listener; import dev.nandi0813.practice.ZonePractice; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.enums.MatchStatus; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; +import dev.nandi0813.practice.manager.fight.util.BlockUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.fight.util.FightUtil; +import dev.nandi0813.practice.manager.fight.util.ListenerUtil; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.interfaces.Spectatable; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Creeper; import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBurnEvent; -import org.bukkit.event.block.BlockFormEvent; -import org.bukkit.event.block.BlockFromToEvent; -import org.bukkit.event.block.BlockPistonExtendEvent; -import org.bukkit.event.block.BlockPistonRetractEvent; -import org.bukkit.event.block.BlockSpreadEvent; +import org.bukkit.event.block.*; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import static dev.nandi0813.practice.util.PermanentConfig.PLACED_IN_FIGHT; @@ -61,12 +63,14 @@ *

  • 1.8.8: TNT tracking entirely via {@link EntitySpawnEvent} (no TNTPrimeEvent available)
  • * */ -public abstract class AbstractBuildListener implements Listener { +public class BuildListener implements Listener { // ========================================================================= // HELPERS — shared by all subclasses // ========================================================================= + private final Map setFuseTick = new HashMap<>(); + /** * Finds the active build-enabled {@link Spectatable} whose cuboid contains the location. * Returns {@code null} if none is found. @@ -81,13 +85,27 @@ protected static Spectatable getByBlock(Block block) { return getByLocation(block.getLocation()); } + protected static Spectatable getByPlayer(Player player) { + return FightUtil.getActiveBuildSpectatables().stream() + .filter(s -> s.getActivePlayerList().contains(player)) + .findFirst().orElse(null); + } + + /** Track the block under a placed block if it will naturally turn to dirt (grass -> dirt). */ + private static void trackUnderBlockIfDirt(Block block, Spectatable spectatable) { + Block under = block.getRelative(0, -1, 0); + if (ArenaUtil.turnsToDirt(under)) { + spectatable.getFightChange().addArenaBlockChange(new ChangedBlock(under)); + } + } + /** * Tags {@code block} with {@code PLACED_IN_FIGHT} metadata pointing to * {@code spectatable} and records it for rollback. */ protected static void tagAndTrack(Block block, Spectatable spectatable) { - block.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), spectatable)); - spectatable.addBlockChange(ClassImport.createChangeBlock(block)); + BlockUtil.setMetadata(block, PLACED_IN_FIGHT, spectatable); + spectatable.addBlockChange(new ChangedBlock(block)); } /** @@ -98,6 +116,91 @@ protected static Ladder ladderOf(Spectatable spectatable) { return (spectatable instanceof Match) ? ((Match) spectatable).getLadder() : null; } + /** + * Applies explosion block filtering rules and tracks all surviving changed blocks for rollback. + */ + private static void filterAndTrackExplosionBlocks(List blockList, Spectatable spectatable) { + final Ladder l = ladderOf(spectatable); + final boolean breakAll = spectatable.isBreakAllBlocks(); + + blockList.removeIf(block -> { + if (block.getType().equals(Material.TNT)) return false; // keep -> chain-explodes + if (ArenaUtil.containsDestroyableBlock(l, block)) return false; // keep -> destroyable + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) return false; // keep -> player placed + if (breakAll) return false; // keep -> break-all-blocks active + if (BlockUtil.hasMetadata(block.getRelative(0, 1, 0), PLACED_IN_FIGHT)) return true; // remove -> support block protected + return true; // remove -> pure arena block + }); + + for (Block block : blockList) { + if (block.getType() == Material.TNT || block.getType() == Material.AIR) continue; + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { + spectatable.addBlockChange(new ChangedBlock(block)); + } else { + // Natural arena block -> use addArenaBlockChange so no PLACED_IN_FIGHT metadata is set. + spectatable.getFightChange().addArenaBlockChange(new ChangedBlock(block)); + } + trackDependentBlocksAbove(block, spectatable); + } + } + + // ========================================================================= + // PLAYER-DRIVEN BLOCK EVENTS (merged from BuildBlockListener) + // ========================================================================= + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent e) { + Block block = e.getBlock(); + + // Case 1: block was placed during the fight -> track it for rollback. + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { + Spectatable spectatable = BlockUtil.getMetadata(block, PLACED_IN_FIGHT, Spectatable.class); + if (ListenerUtil.checkMetaData(spectatable)) return; + if (!spectatable.isBuild()) return; + + spectatable.addBlockChange(new ChangedBlock(block)); + return; + } + + // Case 2: natural arena block -> only allow configured destroyable blocks. + Spectatable spectatable = getByBlock(block); + if (spectatable == null || !spectatable.isBuild()) return; + + var ladder = (spectatable instanceof Match match) ? match.getLadder() : null; + if (ArenaUtil.containsDestroyableBlock(ladder, block)) { + BlockUtil.breakBlock(spectatable, block); + e.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + Block block = event.getBlockPlaced(); + Spectatable spectatable = null; + boolean needsMetadata = false; + + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { + spectatable = BlockUtil.getMetadata(block, PLACED_IN_FIGHT, Spectatable.class); + if (ListenerUtil.checkMetaData(spectatable)) { + return; + } + } else { + spectatable = getByPlayer(event.getPlayer()); + needsMetadata = true; + } + + if (spectatable == null || !spectatable.isBuild()) { + return; + } + + if (needsMetadata) { + BlockUtil.setMetadata(block, PLACED_IN_FIGHT, spectatable); + } + + spectatable.addBlockChange(new ChangedBlock(event)); + trackUnderBlockIfDirt(block, spectatable); + } + // ========================================================================= // EXPLOSIONS // ========================================================================= @@ -114,9 +217,9 @@ protected static Ladder ladderOf(Spectatable spectatable) { */ private static void trackDependentBlocksAbove(Block base, Spectatable spectatable) { Block above = base.getRelative(0, 1, 0); - while (ClassImport.getClasses().getArenaUtil().requiresSupport(above)) { - if (!above.hasMetadata(PLACED_IN_FIGHT)) { - spectatable.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(above)); + while (ArenaUtil.requiresSupport(above)) { + if (!BlockUtil.hasMetadata(above, PLACED_IN_FIGHT)) { + spectatable.getFightChange().addArenaBlockChange(new ChangedBlock(above)); } above = above.getRelative(0, 1, 0); } @@ -136,7 +239,7 @@ private static void trackDependentBlocksAbove(Block base, Spectatable spectatabl * that silently disappear when their support is destroyed. * */ - protected void handleExplosion(org.bukkit.event.Event event, List blockList, Spectatable spectatable) { + protected void handleExplosion(Event event, List blockList, Spectatable spectatable) { if (spectatable == null) return; if (spectatable instanceof Match match) { @@ -146,29 +249,7 @@ protected void handleExplosion(org.bukkit.event.Event event, List blockLi } } - final Ladder l = ladderOf(spectatable); - final boolean breakAll = spectatable.isBreakAllBlocks(); - - blockList.removeIf(block -> { - if (block.getType().equals(Material.TNT)) return false; // keep → chain-explodes - if (ClassImport.getClasses().getArenaUtil().containsDestroyableBlock(l, block)) return false; // keep → destroyable - if (block.hasMetadata(PLACED_IN_FIGHT)) return false; // keep → player placed - if (breakAll) return false; // keep → break-all-blocks active - if (block.getRelative(0, 1, 0).hasMetadata(PLACED_IN_FIGHT)) return true; // remove → support block protected - return true; // remove → pure arena block - }); - - for (Block block : blockList) { - if (block.getType() == Material.TNT || block.getType() == Material.AIR) continue; - if (block.hasMetadata(PLACED_IN_FIGHT)) { - spectatable.addBlockChange(ClassImport.createChangeBlock(block)); - } else { - // Natural arena block — use addArenaBlockChange so no PLACED_IN_FIGHT - // metadata is set (players can't break it manually) but it is restored. - spectatable.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(block)); - } - trackDependentBlocksAbove(block, spectatable); - } + filterAndTrackExplosionBlocks(blockList, spectatable); } @EventHandler @@ -188,25 +269,7 @@ public void onEntityExplode(EntityExplodeEvent e) { return; } } - final Ladder l = ladderOf(spectatable); - final boolean breakAll = spectatable.isBreakAllBlocks(); - e.blockList().removeIf(block -> { - if (block.getType().equals(Material.TNT)) return false; - if (ClassImport.getClasses().getArenaUtil().containsDestroyableBlock(l, block)) return false; - if (block.hasMetadata(PLACED_IN_FIGHT)) return false; - if (breakAll) return false; - if (block.getRelative(0, 1, 0).hasMetadata(PLACED_IN_FIGHT)) return true; - return true; - }); - for (Block block : e.blockList()) { - if (block.getType() == Material.TNT || block.getType() == Material.AIR) continue; - if (block.hasMetadata(PLACED_IN_FIGHT)) { - spectatable.addBlockChange(ClassImport.createChangeBlock(block)); - } else { - spectatable.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(block)); - } - trackDependentBlocksAbove(block, spectatable); - } + filterAndTrackExplosionBlocks(e.blockList(), spectatable); return; } @@ -251,8 +314,9 @@ protected void handleTntSpawn(TNTPrimed tnt, Spectatable spectatable) { * {@code TNTPrimeEvent}. */ protected void onApplyFuseTime(TNTPrimed tnt, Match match) { - if (tnt.getSource() instanceof org.bukkit.entity.Player) { - tnt.setFuseTicks(20 * match.getLadder().getTntFuseTime()); + final String key = locationKey(tnt.getLocation()); + if (setFuseTick.containsKey(key)) { + tnt.setFuseTicks(setFuseTick.remove(key)); } } @@ -270,7 +334,7 @@ public void onEntitySpawnEvent(EntitySpawnEvent e) { // Use the event location (exact spawn point) rather than tnt.getLocation() to avoid // fractional coordinates resolving to the wrong block. spectatable.getFightChange().addArenaBlockChange( - ClassImport.createChangeBlock(e.getLocation().getBlock(), Material.TNT)); + new ChangedBlock(e.getLocation().getBlock(), Material.TNT)); } handleTntSpawn(tnt, spectatable); @@ -285,7 +349,7 @@ public void onEntitySpawnEvent(EntitySpawnEvent e) { * The 1.8.8 default returns {@code false} because there is no pre-spawn event. */ protected boolean isTntBlockAlreadyTracked() { - return false; + return true; } // ========================================================================= @@ -324,19 +388,39 @@ public void onBlockPistonRetract(BlockPistonRetractEvent e) { // BLOCK FORM (cobblestone / obsidian generators, ice, etc.) // ========================================================================= + /** + * Tracks blocks that turn to dirt when another block forms on top (e.g., grass + * becoming dirt when cobblestone is generated via lava). This runs at LOWEST priority + * to capture the block's state BEFORE it changes to dirt. + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onBlockFormLowest(BlockFormEvent e) { + final Block formed = e.getBlock(); + final Spectatable spectatable = getByBlock(formed); + if (spectatable == null || !spectatable.isBuild()) return; + + Block below = formed.getRelative(0, -1, 0); + // At LOWEST, the block below is still grass/mycelium/etc. before conversion. + // Capture its current state so rollback restores the exact original type. + if (ArenaUtil.turnsToDirt(below)) { + Material originalMaterial = below.getType(); + spectatable.getFightChange().addArenaBlockChange( + new ChangedBlock(below, originalMaterial)); + } + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockForm(BlockFormEvent e) { - final Location location = e.getBlock().getLocation(); - final Spectatable spectatable = getByBlock(e.getBlock()); + final Block formed = e.getBlock(); + final Spectatable spectatable = getByBlock(formed); if (spectatable == null || !spectatable.isBuild()) return; - // 2-tick delay to guarantee the block has been written to the world - org.bukkit.Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - Block formed = location.getBlock(); - if (formed.getType() == Material.AIR) return; - if (formed.hasMetadata(PLACED_IN_FIGHT)) return; - tagAndTrack(formed, spectatable); - }, 2L); + + // Track generated block directly so rollback does not miss short-lived form changes. + spectatable.getFightChange().addArenaBlockChange(new ChangedBlock(formed)); + if (!BlockUtil.hasMetadata(formed, PLACED_IN_FIGHT)) { + BlockUtil.setMetadata(formed, PLACED_IN_FIGHT, spectatable); + } } // ========================================================================= @@ -360,17 +444,41 @@ public void onBucketEmpty(PlayerBucketEmptyEvent e) { // The liquid will be placed on the face the player clicked Block liquidSourceBlock = e.getBlockClicked().getRelative(e.getBlockFace()); - if (liquidSourceBlock.hasMetadata(PLACED_IN_FIGHT)) return; // already tracked + if (BlockUtil.hasMetadata(liquidSourceBlock, PLACED_IN_FIGHT)) return; // already tracked // Capture while still AIR (or pre-existing material) so rollback restores correctly - spectatable.getFightChange().addBlockChange(ClassImport.createChangeBlock(liquidSourceBlock)); - liquidSourceBlock.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), spectatable)); + spectatable.getFightChange().addBlockChange(new ChangedBlock(liquidSourceBlock)); + BlockUtil.setMetadata(liquidSourceBlock, PLACED_IN_FIGHT, spectatable); } // ========================================================================= // LIQUID FLOW // ========================================================================= + /** + * Tracks blocks that turn to dirt when lava flows on top (e.g., grass + * becoming dirt when lava spreads over it). This runs at LOWEST priority + * to capture the block's state BEFORE it changes to dirt. + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onBlockFromToLowest(BlockFromToEvent e) { + Block toBlock = e.getToBlock(); + Spectatable spectatable = getByBlock(toBlock); + if (spectatable == null || !spectatable.isBuild()) return; + + // Only handle lava flows (lava turns grass to dirt naturally) + Block fromBlock = e.getBlock(); + if (!fromBlock.isLiquid()) return; + + // At LOWEST, the destination block is still grass/mycelium/etc. before conversion. + // Capture its current state so rollback restores the exact original type. + if (ArenaUtil.turnsToDirt(toBlock)) { + Material originalMaterial = toBlock.getType(); + spectatable.getFightChange().addArenaBlockChange( + new ChangedBlock(toBlock, originalMaterial)); + } + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockFromTo(BlockFromToEvent e) { Block fromBlock = e.getBlock(); @@ -380,9 +488,9 @@ public void onBlockFromTo(BlockFromToEvent e) { Match match = null; // Fast path: source block already tagged — O(1) lookup - if (fromBlock.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = fromBlock.getMetadata(PLACED_IN_FIGHT).get(0); - if (mv.value() instanceof Spectatable s) { + if (BlockUtil.hasMetadata(fromBlock, PLACED_IN_FIGHT)) { + Spectatable s = BlockUtil.getMetadata(fromBlock, PLACED_IN_FIGHT, Spectatable.class); + if (s != null) { spectatable = s; if (spectatable instanceof Match m) match = m; } @@ -396,7 +504,7 @@ public void onBlockFromTo(BlockFromToEvent e) { // Tag the block so future flow events from it hit the fast path and can be // properly cancelled after match end. - fromBlock.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), spectatable)); + BlockUtil.setMetadata(fromBlock, PLACED_IN_FIGHT, spectatable); if (spectatable instanceof Match m) match = m; } @@ -416,9 +524,9 @@ public void onBlockFromTo(BlockFromToEvent e) { // Track all destination blocks so all flowing liquids inside the arena are // properly recorded for rollback — whether the source is player-placed or natural. - if (!toBlock.hasMetadata(PLACED_IN_FIGHT)) { - toBlock.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), spectatable)); - spectatable.getFightChange().addBlockChange(ClassImport.createChangeBlock(toBlock)); + if (!BlockUtil.hasMetadata(toBlock, PLACED_IN_FIGHT)) { + BlockUtil.setMetadata(toBlock, PLACED_IN_FIGHT, spectatable); + spectatable.getFightChange().addBlockChange(new ChangedBlock(toBlock)); } } @@ -432,9 +540,9 @@ public void onBlockSpread(BlockSpreadEvent e) { Spectatable spectatable = null; - if (source.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = source.getMetadata(PLACED_IN_FIGHT).get(0); - if (mv.value() instanceof Spectatable s) { + if (BlockUtil.hasMetadata(source, PLACED_IN_FIGHT)) { + Spectatable s = BlockUtil.getMetadata(source, PLACED_IN_FIGHT, Spectatable.class); + if (s != null) { spectatable = s; } } @@ -455,12 +563,34 @@ public void onBlockSpread(BlockSpreadEvent e) { final Spectatable finalSpectatable = spectatable; final Block newBlock = e.getNewState().getBlock(); - org.bukkit.Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> { - if (newBlock.hasMetadata(PLACED_IN_FIGHT)) return; + Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> { + if (BlockUtil.hasMetadata(newBlock, PLACED_IN_FIGHT)) return; tagAndTrack(newBlock, finalSpectatable); }); } + // ========================================================================= + // BLOCK FADE (grass → dirt, ice melt, etc.) + // ========================================================================= + + /** + * Tracks blocks that fade to another type (e.g. grass/mycelium turning to dirt when + * water is above and blocks light, or ice melting). Runs at LOWEST so the block still + * holds its original material when captured. + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onBlockFade(BlockFadeEvent e) { + Block block = e.getBlock(); + if (!ArenaUtil.turnsToDirt(block)) return; + + Spectatable spectatable = getByBlock(block); + if (spectatable == null || !spectatable.isBuild()) return; + + // At LOWEST the block is still grass/mycelium/etc. — capture the original type. + spectatable.getFightChange().addArenaBlockChange( + new ChangedBlock(block, block.getType())); + } + // ========================================================================= // BLOCK BURN (fire destroying blocks) // ========================================================================= @@ -479,9 +609,9 @@ public void onBlockBurn(BlockBurnEvent e) { Spectatable spectatable = null; // Fast path: block already tagged - if (block.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = block.getMetadata(PLACED_IN_FIGHT).get(0); - if (mv.value() instanceof Spectatable s) { + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { + Spectatable s = BlockUtil.getMetadata(block, PLACED_IN_FIGHT, Spectatable.class); + if (s != null) { spectatable = s; } } @@ -502,10 +632,10 @@ public void onBlockBurn(BlockBurnEvent e) { } // Track the block's original state for rollback - if (block.hasMetadata(PLACED_IN_FIGHT)) { - spectatable.addBlockChange(ClassImport.createChangeBlock(block)); + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { + spectatable.addBlockChange(new ChangedBlock(block)); } else { - spectatable.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(block)); + spectatable.getFightChange().addArenaBlockChange(new ChangedBlock(block)); } // Track adjacent fire blocks so rollback removes the fire that caused/surrounds the burn. @@ -515,9 +645,9 @@ public void onBlockBurn(BlockBurnEvent e) { // After the burn event, the burned block may be replaced with fire. // Schedule a 1-tick delayed check to track it if so. final Spectatable finalSpectatable = spectatable; - org.bukkit.Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> { + Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> { String typeName = block.getType().name(); - if ((typeName.equals("FIRE") || typeName.equals("SOUL_FIRE")) && !block.hasMetadata(PLACED_IN_FIGHT)) { + if ((typeName.equals("FIRE") || typeName.equals("SOUL_FIRE")) && !BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { tagAndTrack(block, finalSpectatable); } }); @@ -540,7 +670,7 @@ private void trackAdjacentFire(Block center, Spectatable spectatable) { for (Block adj : adjacent) { String typeName = adj.getType().name(); if (!typeName.equals("FIRE") && !typeName.equals("SOUL_FIRE")) continue; - if (adj.hasMetadata(PLACED_IN_FIGHT)) continue; + if (BlockUtil.hasMetadata(adj, PLACED_IN_FIGHT)) continue; tagAndTrack(adj, spectatable); } @@ -572,21 +702,21 @@ public void onFallingBlockChange(EntityChangeBlockEvent e) { boolean isLanding = e.getTo() != Material.AIR; // Fast path: entity was tagged when it first started falling inside the arena - if (fallingBlock.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = fallingBlock.getMetadata(PLACED_IN_FIGHT).get(0); - if (!(mv.value() instanceof Spectatable spectatable)) return; + if (BlockUtil.hasMetadata(fallingBlock, PLACED_IN_FIGHT)) { + Spectatable spectatable = BlockUtil.getMetadata(fallingBlock, PLACED_IN_FIGHT, Spectatable.class); + if (spectatable == null) return; if (isLanding) { // Landing spot is still AIR at LOWEST — record as AIR so rollback clears it - if (!affectedBlock.hasMetadata(PLACED_IN_FIGHT)) { + if (!BlockUtil.hasMetadata(affectedBlock, PLACED_IN_FIGHT)) { spectatable.getFightChange().addArenaBlockChange( - ClassImport.createChangeBlock(affectedBlock, Material.AIR)); + new ChangedBlock(affectedBlock, Material.AIR)); } } else { // Start falling: block is still its original material — capture it now - if (!affectedBlock.hasMetadata(PLACED_IN_FIGHT)) { + if (!BlockUtil.hasMetadata(affectedBlock, PLACED_IN_FIGHT)) { spectatable.getFightChange().addArenaBlockChange( - ClassImport.createChangeBlock(affectedBlock)); + new ChangedBlock(affectedBlock)); } spectatable.addEntityChange(fallingBlock); } @@ -598,19 +728,50 @@ public void onFallingBlockChange(EntityChangeBlockEvent e) { if (spectatable == null || !spectatable.isBuild()) return; // Tag entity so fast path handles the landing event - fallingBlock.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), spectatable)); + BlockUtil.setMetadata(fallingBlock, PLACED_IN_FIGHT, spectatable); spectatable.addEntityChange(fallingBlock); if (isLanding) { - if (!affectedBlock.hasMetadata(PLACED_IN_FIGHT)) { + if (!BlockUtil.hasMetadata(affectedBlock, PLACED_IN_FIGHT)) { spectatable.getFightChange().addArenaBlockChange( - ClassImport.createChangeBlock(affectedBlock, Material.AIR)); + new ChangedBlock(affectedBlock, Material.AIR)); } } else { - if (!affectedBlock.hasMetadata(PLACED_IN_FIGHT)) { + if (!BlockUtil.hasMetadata(affectedBlock, PLACED_IN_FIGHT)) { spectatable.getFightChange().addArenaBlockChange( - ClassImport.createChangeBlock(affectedBlock)); + new ChangedBlock(affectedBlock)); } } } + + private String locationKey(Location loc) { + return Objects.requireNonNull(loc.getWorld()).getName() + + ":" + loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); + } + + @EventHandler + public void onTntPrimeEvent(TNTPrimeEvent e) { + Spectatable spectatable = getByBlock(e.getBlock()); + if (spectatable == null) return; + + // Track the TNT block NOW — it is still TNT in the world at this point. + if (spectatable.isBuild()) { + spectatable.getFightChange().addArenaBlockChange(new ChangedBlock(e.getBlock())); + } + + // Record custom fuse time for match contexts + if (spectatable instanceof Match match) { + if (!e.getCause().equals(TNTPrimeEvent.PrimeCause.EXPLOSION)) { + setFuseTick.put(locationKey(e.getBlock().getLocation()), + match.getLadder().getTntFuseTime() * 20); + } + } + } + + @EventHandler + public void onBlockExplode(BlockExplodeEvent e) { + Spectatable spectatable = getByBlock(e.getBlock()); + handleExplosion(e, e.blockList(), spectatable); + } + } diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/EPCountdownListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/EPCountdownListener.java similarity index 79% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/EPCountdownListener.java rename to core/src/main/java/dev/nandi0813/practice/manager/fight/listener/EPCountdownListener.java index a7d8a7f5d..7708470b7 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/EPCountdownListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/EPCountdownListener.java @@ -1,12 +1,11 @@ -package dev.nandi0813.practice_modern.listener; +package dev.nandi0813.practice.manager.fight.listener; import dev.nandi0813.practice.manager.fight.ffa.FFAManager; import dev.nandi0813.practice.manager.fight.ffa.game.FFA; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.util.PermanentConfig; +import dev.nandi0813.practice.manager.fight.util.ModernItemCooldownHandler; import io.papermc.paper.event.player.PlayerItemCooldownEvent; import org.bukkit.Material; import org.bukkit.entity.EnderPearl; @@ -76,14 +75,7 @@ public void onProjectileShoot(ProjectileLaunchEvent e) { return; } - ClassImport.getClasses().getItemCooldownHandler().handleEnderPearlFFA( - player, - ffa.getFightPlayers().get(player), - duration, - PermanentConfig.FFA_EXP_BAR, - e, - "FFA.GAME.COOLDOWN.ENDER-PEARL" - ); + ModernItemCooldownHandler.handleEnderPearl(player, duration, e); return; } @@ -99,14 +91,7 @@ public void onProjectileShoot(ProjectileLaunchEvent e) { return; } - ClassImport.getClasses().getItemCooldownHandler().handleEnderPearlMatch( - player, - match.getMatchPlayers().get(player), - duration, - PermanentConfig.MATCH_EXP_BAR, - e, - "MATCH.COOLDOWN.ENDER-PEARL" - ); + ModernItemCooldownHandler.handleEnderPearl(player, duration, e); } } diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FireworkRocketCooldownListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/FireworkRocketCooldownListener.java similarity index 57% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FireworkRocketCooldownListener.java rename to core/src/main/java/dev/nandi0813/practice/manager/fight/listener/FireworkRocketCooldownListener.java index 395faa601..a7acd8ede 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FireworkRocketCooldownListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/listener/FireworkRocketCooldownListener.java @@ -1,23 +1,17 @@ -package dev.nandi0813.practice_modern.listener; +package dev.nandi0813.practice.manager.fight.listener; import dev.nandi0813.practice.manager.fight.ffa.FFAManager; import dev.nandi0813.practice.manager.fight.ffa.game.FFA; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.fight.util.ModernItemCooldownHandler; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntitySpawnEvent; -/** - * Handles firework rocket cooldown for elytra boost in modern Minecraft versions. - * This prevents spam-boosting with firework rockets when flying with elytra. - * Delegates to {@link dev.nandi0813.practice.module.interfaces.ItemCooldownHandler} - * so the modern implementation can apply a native hotbar visual cooldown. - */ public class FireworkRocketCooldownListener implements Listener { @EventHandler @@ -33,13 +27,8 @@ public void onFireworkSpawn(EntitySpawnEvent e) { int duration = ffa.getPlayers().get(player).getFireworkRocketCooldown(); if (duration <= 0) return; - ClassImport.getClasses().getItemCooldownHandler().handleFireworkRocketFFA( - player, - ffa.getFightPlayers().get(player), - duration, - null, - "MATCH.COOLDOWN.FIREWORK-ROCKET-COOLDOWN" - ); + ModernItemCooldownHandler.handleFireworkRocket(player, duration, null); + return; } @@ -54,13 +43,7 @@ public void onFireworkSpawn(EntitySpawnEvent e) { return; } - ClassImport.getClasses().getItemCooldownHandler().handleFireworkRocketMatch( - player, - match.getMatchPlayers().get(player), - duration, - null, - "MATCH.COOLDOWN.FIREWORK-ROCKET-COOLDOWN" - ); + ModernItemCooldownHandler.handleFireworkRocket(player, duration, null); } } } \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Match.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Match.java index be697460f..df73321eb 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Match.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Match.java @@ -15,6 +15,7 @@ import dev.nandi0813.practice.manager.fight.match.util.MatchFightPlayer; import dev.nandi0813.practice.manager.fight.match.util.MatchUtil; import dev.nandi0813.practice.manager.fight.match.util.TeamUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.gui.GUIItem; import dev.nandi0813.practice.manager.gui.guis.MatchStatsGui; @@ -29,8 +30,6 @@ import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; import dev.nandi0813.practice.manager.spectator.SpectatorManager; -import dev.nandi0813.practice.module.interfaces.ChangedBlock; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import dev.nandi0813.practice.util.StringUtil; @@ -164,16 +163,16 @@ public void entityVanish(Player player) { if (players.contains(player)) { for (Entity entity : arena.getCuboid().getEntities()) { if (!(entity instanceof Player)) { - ClassImport.getClasses().getEntityHider().hideEntity(player, entity); + ZonePractice.getEntityHider().hideEntity(player, entity); } } } else if (spectators.contains(player)) { for (Entity entity : arena.getCuboid().getEntities()) { if (!(entity instanceof Player)) { if (fightChange.containsEntity(entity)) - ClassImport.getClasses().getEntityHider().showEntity(player, entity); + ZonePractice.getEntityHider().showEntity(player, entity); else - ClassImport.getClasses().getEntityHider().hideEntity(player, entity); + ZonePractice.getEntityHider().hideEntity(player, entity); } } } @@ -220,7 +219,7 @@ public void killPlayer(Player player, Player killer, String deathMessage) { // check whether a recent attacker should be credited instead. if (killer == null) { Player lastAttacker = getLastAttacker(player); - if (lastAttacker != null && deathMessage != null + if (lastAttacker != null && !lastAttacker.equals(player) && deathMessage != null && deathMessage.equals(dev.nandi0813.practice.manager.fight.util.DeathCause.VOID.getMessage())) { killer = lastAttacker; deathMessage = dev.nandi0813.practice.manager.fight.util.DeathCause.VOID_BY_PLAYER @@ -439,6 +438,11 @@ public void removeSpectator(Player player) { } } + @Override + public List getActivePlayerList() { + return this.players; + } + @Override public boolean isBuild() { return ladder.isBuild(); @@ -455,7 +459,7 @@ public void addEntityChange(Entity entity) { if (!ladder.isBuild()) { for (Player player : MatchManager.getInstance().getHidePlayers(this)) { - ClassImport.getClasses().getEntityHider().hideEntity(player, entity); + ZonePractice.getEntityHider().hideEntity(player, entity); } } } @@ -564,7 +568,7 @@ public String getFormattedTime() { public GUIItem getSpectatorMenuItem() { return GUIFile.getGuiItem("GUIS.SPECTATOR-MENU.ICONS.MATCH-ICON") .setMaterial(ladder.getIcon().getType()) - .setDamage(ladder.getIcon().getDurability()) + .setDamage(Common.getItemDamage(ladder.getIcon())) .replace("%match_id%", id) .replace("%weight_class%", ((this instanceof Duel && ((Duel) this).isRanked()) ? WeightClass.RANKED.getName() : WeightClass.UNRANKED.getName())) .replace("%match_type%", type.getName(false)) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/MatchManager.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/MatchManager.java index 20d821cd7..a1bff9baa 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/MatchManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/MatchManager.java @@ -5,6 +5,7 @@ import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.arenas.interfaces.BasicArena; import dev.nandi0813.practice.manager.fight.belowname.BelowNameManager; +import dev.nandi0813.practice.manager.fight.match.listener.LadderTypeListener; import dev.nandi0813.practice.manager.fight.match.listener.MatchEventListener; import dev.nandi0813.practice.manager.fight.match.listener.MatchLifecycleListener; import dev.nandi0813.practice.manager.fight.match.listener.StartListener; @@ -53,6 +54,8 @@ private MatchManager() { // Register start command listener Bukkit.getPluginManager().registerEvents(new StartListener(), practice); + Bukkit.getPluginManager().registerEvents(new LadderTypeListener(), practice); + this.belowNameManager = BelowNameManager.getInstance(); PacketEvents.getAPI().getEventManager().registerListener(this.belowNameManager, PacketListenerPriority.NORMAL); } @@ -157,4 +160,21 @@ public RematchRequest getRematchRequest(Player player) { return null; } + public void invalidateRematch(RematchRequest rematchRequest) { + if (rematchRequest == null) return; + + if (rematches.remove(rematchRequest)) { + rematchRequest.invalidate(); + } + } + + public void invalidateRematchByPlayer(Player player) { + if (player == null) return; + + RematchRequest rematchRequest = getRematchRequest(player); + if (rematchRequest != null) { + invalidateRematch(rematchRequest); + } + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Round.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Round.java index 4c54d2a07..b3f81ed09 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Round.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/Round.java @@ -11,10 +11,10 @@ import dev.nandi0813.practice.manager.fight.match.util.MatchFightPlayer; import dev.nandi0813.practice.manager.fight.match.util.MatchUtil; import dev.nandi0813.practice.manager.fight.match.util.TempKillPlayer; +import dev.nandi0813.practice.manager.fight.util.BedUtil; import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.ladder.enums.LadderType; import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.StringUtil; import dev.nandi0813.practice.util.entityhider.PlayerHider; import dev.nandi0813.practice.util.playerutil.PlayerUtil; @@ -54,8 +54,8 @@ protected Round(Match match, int roundNumber) { this.bedStatus.put(team, true); // Set the beds - ClassImport.getClasses().getBedUtil().placeBed(match.getArena().getBedLoc1().getLocation(), match.getArena().getBedLoc1().getFacing()); - ClassImport.getClasses().getBedUtil().placeBed(match.getArena().getBedLoc2().getLocation(), match.getArena().getBedLoc2().getFacing()); + BedUtil.placeBed(match.getArena().getBedLoc1().getLocation(), match.getArena().getBedLoc1().getFacing()); + BedUtil.placeBed(match.getArena().getBedLoc2().getLocation(), match.getArena().getBedLoc2().getFacing()); } for (Player player : match.getPlayers()) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/LadderTypeListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/LadderTypeListener.java index 66592afb4..3570058b5 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/LadderTypeListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/LadderTypeListener.java @@ -1,54 +1,58 @@ package dev.nandi0813.practice.manager.fight.match.listener; +import com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent; import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.arenas.interfaces.BasicArena; import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.event.EventManager; +import dev.nandi0813.practice.manager.fight.event.events.duel.brackets.Brackets; +import dev.nandi0813.practice.manager.fight.event.interfaces.Event; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; import dev.nandi0813.practice.manager.fight.match.runnable.game.BridgeArrowRunnable; -import dev.nandi0813.practice.manager.fight.util.BlockUtil; -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import dev.nandi0813.practice.manager.fight.util.ListenerUtil; +import dev.nandi0813.practice.manager.fight.match.util.KnockbackUtil; +import dev.nandi0813.practice.manager.fight.match.util.MatchFightPlayer; +import dev.nandi0813.practice.manager.fight.match.util.TeamUtil; +import dev.nandi0813.practice.manager.fight.util.*; +import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; +import dev.nandi0813.practice.manager.ladder.enums.KnockbackType; import dev.nandi0813.practice.manager.ladder.enums.LadderType; import dev.nandi0813.practice.manager.ladder.type.Bridges; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.spectator.SpectatorManager; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import dev.nandi0813.practice.util.NumberUtil; import dev.nandi0813.practice.util.PermanentConfig; import dev.nandi0813.practice.util.cooldown.CooldownObject; import dev.nandi0813.practice.util.cooldown.PlayerCooldown; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Item; -import org.bukkit.entity.Player; -import org.bukkit.entity.ThrownExpBottle; +import org.bukkit.damage.DamageSource; +import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityShootBowEvent; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.entity.*; import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; +import static dev.nandi0813.practice.manager.arena.util.ArenaUtil.containsDestroyableBlock; import static dev.nandi0813.practice.util.PermanentConfig.FIGHT_ENTITY; import static dev.nandi0813.practice.util.PermanentConfig.PLACED_IN_FIGHT; -public abstract class LadderTypeListener implements Listener { +public class LadderTypeListener implements Listener { // ========== HELPER METHODS ========== @@ -91,13 +95,11 @@ protected boolean isWithinBuildLimits(Block block, Match match, Player player) { * Extracts match from item metadata. */ protected Match getMatchFromItemMetadata(Item item) { - if (!item.hasMetadata(HIDDEN_ITEM)) return null; + if (!BlockUtil.hasMetadata(item, HIDDEN_ITEM)) return null; - MetadataValue metadataValue = BlockUtil.getMetadata(item, HIDDEN_ITEM); + Match metadataValue = BlockUtil.getMetadata(item, HIDDEN_ITEM, Match.class); if (ListenerUtil.checkMetaData(metadataValue)) return null; - if (!(metadataValue.value() instanceof Match)) return null; - - return (Match) metadataValue.value(); + return metadataValue; } /** @@ -156,7 +158,7 @@ public void onProjectileLaunch(ProjectileLaunchEvent e) { Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); if (match != null && match.getLadder() instanceof dev.nandi0813.practice.manager.ladder.type.Spleef spleef && spleef.isSnowballMode()) { - snowball.setMetadata(FIGHT_ENTITY, new FixedMetadataValue(ZonePractice.getInstance(), match)); + BlockUtil.setMetadata(snowball, FIGHT_ENTITY, match); } } } @@ -166,10 +168,10 @@ public void onProjectileLaunch(ProjectileLaunchEvent e) { @EventHandler public void onProjectileHit(ProjectileHitEvent e) { Entity entity = e.getEntity(); - MetadataValue mv = BlockUtil.getMetadata(entity, FIGHT_ENTITY); + Match mv = BlockUtil.getMetadata(entity, FIGHT_ENTITY, Match.class); if (ListenerUtil.checkMetaData(mv)) return; - if (!(mv.value() instanceof Match match)) return; + Match match = mv; if (match.getLadder() instanceof LadderHandle ladderHandle) { ladderHandle.handleEvents(e, match); @@ -194,7 +196,7 @@ public void onPlayerInteract(PlayerInteractEvent e) { if (roundStatus.equals(RoundStatus.START) && item != null && ( item.getType().equals(Material.POTION) || - item.getType().equals(ClassImport.getClasses().getItemMaterialUtil().getSplashPotion()) || + item.getType().equals(Material.SPLASH_POTION) || item.getType().isEdible() )) { e.setCancelled(false); @@ -231,9 +233,9 @@ public void onBlockBreak(BlockBreakEvent e) { Block block = e.getBlock(); - // Blocks placed during the fight — allow breaking (tracking done by BuildBlockListener) - if (block.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = BlockUtil.getMetadata(block, PLACED_IN_FIGHT); + // Blocks placed during the fight — allow breaking (tracking done by BuildListener) + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) { + Object mv = BlockUtil.getMetadata(block, PLACED_IN_FIGHT, Object.class); if (ListenerUtil.checkMetaData(mv)) { e.setCancelled(true); } @@ -247,14 +249,14 @@ public void onBlockBreak(BlockBreakEvent e) { } // Handle destroyable blocks (beds, etc.) - if (ClassImport.getClasses().getArenaUtil().containsDestroyableBlock(match.getLadder(), block)) { + if (containsDestroyableBlock(match.getLadder(), block)) { BlockUtil.breakBlock(match, block); } // When break-all-blocks is enabled, track the natural arena block for rollback // and allow the break — the player can destroy any block in the arena. if (match.getLadder().isBreakAllBlocks()) { - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(block)); + match.getFightChange().addArenaBlockChange(new ChangedBlock(block)); return; // do NOT cancel — let the break happen } @@ -292,7 +294,7 @@ public void onBlockPlace(BlockPlaceEvent e) { } delegateToLadderHandle(e, match); - // Tagging and tracking handled by BuildBlockListener at MONITOR priority + // Tagging and tracking handled by BuildListener at MONITOR priority } @@ -327,7 +329,7 @@ public void onBucketEmpty(PlayerBucketEmptyEvent e) { return; } - if (!isWithinBuildLimits(block, match, player)) { + if (!isWithinBuildLimits(block.getRelative(e.getBlockFace()), match, player)) { e.setCancelled(true); return; } @@ -433,7 +435,7 @@ public void onItemDrop(PlayerDropItemEvent e) { Entity entity = e.getItemDrop(); match.addEntityChange(entity); - entity.setMetadata(HIDDEN_ITEM, new FixedMetadataValue(ZonePractice.getInstance(), match)); + BlockUtil.setMetadata(entity, HIDDEN_ITEM, match); } @EventHandler @@ -460,7 +462,7 @@ public void onItemPickup(PlayerPickupItemEvent e) { return; } - if (!ClassImport.getClasses().getEntityHider().canSee(player, e.getItem())) { + if (!ZonePractice.getEntityHider().canSee(player, e.getItem())) { e.setCancelled(true); return; } @@ -511,10 +513,215 @@ public void onPlayerShootBow(EntityShootBowEvent e) { // register it for rollback cleanup (and hiding from players in other matches), // and schedule a 5-minute vanilla-style self-removal. if (e.getProjectile() instanceof org.bukkit.entity.Arrow arrow) { - arrow.setMetadata(FIGHT_ENTITY, new FixedMetadataValue(ZonePractice.getInstance(), match)); + BlockUtil.setMetadata(arrow, FIGHT_ENTITY, match); match.addEntityChange(arrow); // hides from other-arena players + rollback tracking } } + @EventHandler + public void onPlayerDamage(EntityDamageEvent e) { + if (!(e.getEntity() instanceof Player player)) return; + + Profile profile = ProfileManager.getInstance().getProfile(player); + if (profile == null) return; + + Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); + if (match == null) return; + + if (ListenerUtil.cancelEvent(match, player)) { + e.setDamage(0); + e.setCancelled(true); + return; + } + + if (e instanceof EntityDamageByEntityEvent) { + onEntityDamageByEntity((EntityDamageByEntityEvent) e); + } + + if (match.getLadder() instanceof LadderHandle ladderHandle) { + ladderHandle.handleEvents(e, match); + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e) { + Player player = e.getEntity(); + + Profile profile = ProfileManager.getInstance().getProfile(player); + if (profile == null) return; + + Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); + if (match == null) return; + + e.setCancelled(true); + + DamageSource damageSource = e.getDamageSource(); + Player killer; + if (damageSource.getCausingEntity() instanceof Entity damageEntity) { + killer = FightUtil.getKiller(damageEntity); + } else { + killer = null; + } + + DeathCause cause = FightUtil.convert(damageSource.getDamageType()); + Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> + match.killPlayer(player, killer, cause.getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")), 1L); + + if (killer != null) { + Statistic statistic = match.getCurrentStat(killer); + statistic.setKills(statistic.getKills() + 1); + } + } + + private static void onEntityDamageByEntity(EntityDamageByEntityEvent e) { + if (!(e.getEntity() instanceof Player target)) return; + + Player attacker = null; + if (e.getDamager() instanceof Player) { + attacker = (Player) e.getDamager(); + } else if (e.getDamager() instanceof Projectile projectile) { + if (projectile.getShooter() instanceof Player) { + attacker = (Player) projectile.getShooter(); + + if (projectile instanceof Arrow) { + arrowDisplayHearth(attacker, target, e.getFinalDamage()); + } + } + } + + if (attacker == null) return; + + Profile attackerProfile = ProfileManager.getInstance().getProfile(attacker); + Profile targetProfile = ProfileManager.getInstance().getProfile(target); + + if (!attackerProfile.getStatus().equals(ProfileStatus.MATCH)) return; + if (!targetProfile.getStatus().equals(ProfileStatus.MATCH)) return; + + Match match = MatchManager.getInstance().getLiveMatchByPlayer(attacker); + if (match != MatchManager.getInstance().getLiveMatchByPlayer(target)) { + e.setCancelled(true); + return; + } + + if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) return; + + boolean cancel = match.getCurrentStat(attacker).isSet() || match.getCurrentStat(target).isSet(); + + if (!cancel) { + cancel = TeamUtil.isSaveTeamMate(match, attacker, target); + } + + if (cancel) { + e.setCancelled(true); + return; + } else { + if (match.getLadder() instanceof LadderHandle ladderHandle) { + ladderHandle.handleEvents(e, match); + } + } + + // Always record the attacker for void-kill attribution, + // regardless of whether the event was cancelled by a ladder handler. + match.recordAttack(target, attacker); + + if (!e.isCancelled() && !match.getLadder().getLadderKnockback().getKnockbackType().equals(KnockbackType.DEFAULT)) { + KnockbackUtil.setPlayerKnockback(target, match.getLadder().getLadderKnockback().getKnockbackType()); + } + } + + @EventHandler + public void onExpPickup(PlayerPickupExperienceEvent e) { + Player player = e.getPlayer(); + + if (SpectatorManager.getInstance().getSpectators().containsKey(player)) { + e.setCancelled(true); + } + } + + @EventHandler + public void onEntityTarget(EntityTargetEvent e) { + if (!(e.getTarget() instanceof Player player)) { + return; + } + + if (SpectatorManager.getInstance().getSpectators().containsKey(player)) { + e.setCancelled(true); + } + } + + /** + * Prevents players from swapping items in their hands before they have chosen a kit. + */ + @EventHandler + public void onPlayerSwapHandItemsEvent(PlayerSwapHandItemsEvent e) { + Player player = e.getPlayer(); + Profile profile = ProfileManager.getInstance().getProfile(player); + + if (profile.getStatus() == ProfileStatus.MATCH) { + Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); + if (match != null) { + MatchFightPlayer matchFightPlayer = match.getMatchPlayers().get(player); + if (!matchFightPlayer.isHasChosenKit()) { + e.setCancelled(true); + } + } + } + } + + /** + * Prevents players from swapping items in their hands before they have chosen a kit. + * Or when they are in the kit editor. + */ + @EventHandler + public void onInventoryClick(InventoryClickEvent e) { + if (!(e.getWhoClicked() instanceof Player player)) { + return; + } + Profile profile = ProfileManager.getInstance().getProfile(player); + + if (e.getAction().equals(InventoryAction.HOTBAR_SWAP)) { + switch (profile.getStatus()) { + case MATCH -> { + Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); + if (match != null) { + MatchFightPlayer matchFightPlayer = match.getMatchPlayers().get(player); + if (!matchFightPlayer.isHasChosenKit()) { + e.setCancelled(true); + } + } + } + case EDITOR -> e.setCancelled(true); + } + } + } + + @EventHandler + public void onWindCharge(ProjectileLaunchEvent e) { + if (!(e.getEntity() instanceof WindCharge)) { + return; + } + + if (!(e.getEntity().getShooter() instanceof Player player)) { + return; + } + + Profile profile = ProfileManager.getInstance().getProfile(player); + switch (profile.getStatus()) { + case MATCH -> { + Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); + if (match != null && !match.getLadder().isBuild()) { + Common.sendMMMessage(player, LanguageManager.getString("MATCH.ONLY-CHARGE-WIND")); + e.setCancelled(true); + } + } + case EVENT -> { + Event event = EventManager.getInstance().getEventByPlayer(player); + if (event instanceof Brackets) { + Common.sendMMMessage(player, LanguageManager.getString("MATCH.ONLY-CHARGE-WIND")); + e.setCancelled(true); + } + } + } + } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/MatchEventListener.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/MatchEventListener.java index aabc7192f..d0f0575af 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/MatchEventListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/listener/MatchEventListener.java @@ -5,7 +5,7 @@ import dev.nandi0813.practice.manager.fight.match.enums.TeamEnum; import dev.nandi0813.practice.manager.fight.match.interfaces.Team; import dev.nandi0813.practice.manager.fight.match.util.MatchFightPlayer; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -39,7 +39,7 @@ public void onPlayerInteract(PlayerInteractEvent e) { Block clickedBlock = e.getClickedBlock(); if (action.equals(Action.RIGHT_CLICK_BLOCK) && clickedBlock != null) { if (clickedBlock.getType().equals(Material.CHEST) || clickedBlock.getType().equals(Material.TRAPPED_CHEST)) { - match.addBlockChange(ClassImport.createChangeBlock(clickedBlock)); + match.addBlockChange(new ChangedBlock(clickedBlock)); } } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java index 64629c6d9..7d4046c9e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/duel/Duel.java @@ -22,7 +22,6 @@ import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.server.sound.SoundManager; import dev.nandi0813.practice.manager.server.sound.SoundType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.playerutil.PlayerUtil; import lombok.Getter; import org.bukkit.entity.Player; @@ -53,7 +52,7 @@ public Duel(Ladder ladder, Arena arena, List players, boolean ranked, in this.type = MatchType.DUEL; this.ranked = ranked; - this.player1 = players.get(0); + this.player1 = players.getFirst(); this.playerProfiles.put(player1, ProfileManager.getInstance().getProfile(player1)); NametagManager.getInstance().setNametag(player1, TeamEnum.TEAM1.getPrefix(), TeamEnum.TEAM1.getNameColor(), TeamEnum.TEAM1.getSuffix(), 20); @@ -144,7 +143,7 @@ protected void killPlayer(Player player, String deathMessage) { new TempKillPlayer(round, player, respawnableLadder.getRespawnTime()); SoundManager.getInstance().getSound(SoundType.MATCH_PLAYER_TEMP_DEATH).play(this.getPeople()); }); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); player.setHealth(20); break; @@ -155,7 +154,7 @@ protected void killPlayer(Player player, String deathMessage) { this.teleportPlayer(player); endRound = true; SoundManager.getInstance().getSound(SoundType.MATCH_PLAYER_DEATH).play(this.getPeople()); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); player.setHealth(20); } else if (isScoringLadder()) { // Scoring ladder (like Boxing) - death doesn't end round @@ -164,8 +163,8 @@ protected void killPlayer(Player player, String deathMessage) { // Default death behavior for standard ladders this.getCurrentStat(player).end(true); PlayerUtil.setFightPlayer(player); - addEntityChange(ClassImport.getClasses().getPlayerUtil().dropPlayerInventory(player)); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + addEntityChange(dev.nandi0813.practice.manager.fight.util.PlayerUtil.dropPlayerInventory(player)); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); player.setHealth(20); SoundManager.getInstance().getSound(SoundType.MATCH_PLAYER_DEATH).play(this.getPeople()); endRound = true; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/partyffa/PartyFFA.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/partyffa/PartyFFA.java index 815deb627..5d79b3e80 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/partyffa/PartyFFA.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/partyffa/PartyFFA.java @@ -10,17 +10,16 @@ import dev.nandi0813.practice.manager.fight.match.enums.MatchType; import dev.nandi0813.practice.manager.fight.match.enums.TeamEnum; import dev.nandi0813.practice.manager.fight.match.util.MatchPlayerUtil; +import dev.nandi0813.practice.manager.fight.match.util.TempKillPlayer; import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.inventory.InventoryManager; -import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.DeathResult; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; -import dev.nandi0813.practice.manager.party.Party; +import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.DeathResult; import dev.nandi0813.practice.manager.nametag.NametagManager; +import dev.nandi0813.practice.manager.party.Party; import dev.nandi0813.practice.manager.server.sound.SoundManager; import dev.nandi0813.practice.manager.server.sound.SoundType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.playerutil.PlayerUtil; -import dev.nandi0813.practice.manager.fight.match.util.TempKillPlayer; import lombok.Getter; import org.bukkit.entity.Player; @@ -102,7 +101,7 @@ protected void killPlayer(Player player, String deathMessage) { new TempKillPlayer(round, player, respawnableLadder.getRespawnTime()); SoundManager.getInstance().getSound(SoundType.MATCH_PLAYER_TEMP_DEATH).play(this.getPeople()); }); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); player.setHealth(20); return; @@ -119,9 +118,9 @@ protected void killPlayer(Player player, String deathMessage) { PlayerUtil.setFightPlayer(player); if (ladder.isDropInventoryPartyGames()) - addEntityChange(ClassImport.getClasses().getPlayerUtil().dropPlayerInventory(player)); + addEntityChange(dev.nandi0813.practice.manager.fight.util.PlayerUtil.dropPlayerInventory(player)); else - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); // Send a death notification message String playerDieMsg = LanguageManager.getString("MATCH.PARTY-FFA.PLAYER-DIE"); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/playersvsplayers/PlayersVsPlayers.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/playersvsplayers/PlayersVsPlayers.java index 5f7d85767..e2936f151 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/playersvsplayers/PlayersVsPlayers.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/type/playersvsplayers/PlayersVsPlayers.java @@ -17,7 +17,6 @@ import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.DeathResult; import dev.nandi0813.practice.manager.server.sound.SoundManager; import dev.nandi0813.practice.manager.server.sound.SoundType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.playerutil.PlayerUtil; import lombok.Getter; import org.bukkit.entity.Player; @@ -73,7 +72,7 @@ protected void killPlayer(Player player, String deathMessage) { new TempKillPlayer(round, player, respawnableLadder.getRespawnTime()); SoundManager.getInstance().getSound(SoundType.MATCH_PLAYER_TEMP_DEATH).play(this.getPeople()); }); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); player.setHealth(20); break; @@ -89,7 +88,7 @@ protected void killPlayer(Player player, String deathMessage) { else MatchPlayerUtil.hidePlayerPartyGames(player, this.players); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); player.setHealth(20); } else if (isScoringLadder()) { // Scoring ladder (like Boxing) - death doesn't end round @@ -102,9 +101,9 @@ protected void killPlayer(Player player, String deathMessage) { PlayerUtil.setFightPlayer(player); if (ladder.isDropInventoryPartyGames()) - addEntityChange(ClassImport.getClasses().getPlayerUtil().dropPlayerInventory(player)); + addEntityChange(dev.nandi0813.practice.manager.fight.util.PlayerUtil.dropPlayerInventory(player)); else - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); if (this.getLanguagePath() != null) { String teamDeathMSG = LanguageManager.getString(this.getLanguagePath() + ".PLAYER-DIE"); @@ -123,7 +122,7 @@ protected void killPlayer(Player player, String deathMessage) { else MatchPlayerUtil.hidePlayerPartyGames(player, this.players); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); player.setHealth(20); } break; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/KitUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/KitUtil.java index 91549a195..081b19973 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/KitUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/KitUtil.java @@ -1,9 +1,10 @@ package dev.nandi0813.practice.manager.fight.match.util; import dev.nandi0813.practice.manager.fight.match.enums.TeamEnum; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; -import dev.nandi0813.practice.module.interfaces.KitData; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.ladder.util.LadderUtil; +import dev.nandi0813.practice.util.KitData; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -20,15 +21,15 @@ public static void loadDefaultLadderKit(Player player, TeamEnum team, Ladder lad } public static void loadKit(Player player, TeamEnum team, ItemStack[] armor, ItemStack[] inventory, ItemStack[] extra) { - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + PlayerUtil.clearInventory(player); if (team == null) { - ClassImport.getClasses().getLadderUtil().loadInventory(player, armor, inventory, extra); + LadderUtil.loadInventory(player, armor, inventory, extra); } else { List inventoryList = new ArrayList<>(); for (ItemStack item : new ArrayList<>(Arrays.asList(inventory.clone()))) { if (item != null) { - item = ClassImport.getClasses().getLadderUtil().changeItemColor(item, team.getColor()); + item = LadderUtil.changeItemColor(item, team.getColor()); inventoryList.add(item); } else { inventoryList.add(null); @@ -38,7 +39,7 @@ public static void loadKit(Player player, TeamEnum team, ItemStack[] armor, Item List armorList = new ArrayList<>(); for (ItemStack item : new ArrayList<>(Arrays.asList(armor.clone()))) { if (item != null) { - item = ClassImport.getClasses().getLadderUtil().changeItemColor(item, team.getColor()); + item = LadderUtil.changeItemColor(item, team.getColor()); armorList.add(item); } else { armorList.add(null); @@ -49,7 +50,7 @@ public static void loadKit(Player player, TeamEnum team, ItemStack[] armor, Item if (extra != null) { for (ItemStack item : new ArrayList<>(Arrays.asList(extra.clone()))) { if (item != null) { - item = ClassImport.getClasses().getLadderUtil().changeItemColor(item, team.getColor()); + item = LadderUtil.changeItemColor(item, team.getColor()); extraList.add(item); } else { extraList.add(null); @@ -57,7 +58,7 @@ public static void loadKit(Player player, TeamEnum team, ItemStack[] armor, Item } } - ClassImport.getClasses().getLadderUtil().loadInventory(player, + LadderUtil.loadInventory(player, armorList.toArray(new ItemStack[0]), inventoryList.toArray(new ItemStack[0]), extra != null ? extraList.toArray(new ItemStack[0]) : null); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchPlayerUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchPlayerUtil.java index 07c2fbcdf..cae1bb571 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchPlayerUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchPlayerUtil.java @@ -1,7 +1,6 @@ package dev.nandi0813.practice.manager.fight.match.util; import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.entityhider.PlayerHider; import dev.nandi0813.practice.util.playerutil.PlayerUtil; import org.bukkit.Bukkit; @@ -20,7 +19,7 @@ public static void hidePlayerPartyGames(Player hider, List matchPlayers) PlayerUtil.setFightPlayer(hider); - ClassImport.getClasses().getPlayerUtil().setCollidesWithEntities(hider, false); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.setCollidesWithEntities(hider, false); Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { hider.setAllowFlight(true); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchUtil.java index 1364de77b..3f250ad19 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/MatchUtil.java @@ -91,7 +91,7 @@ public static void safePlayerTeleportBlock(Block block) { if (block == null) return; if (!block.getWorld().isChunkLoaded(block.getX() >> 4, block.getZ() >> 4)) return; if (block.getType().equals(Material.AIR)) - block.setType(Material.BEDROCK); + block.setBlockData(Material.BEDROCK.createBlockData()); } public static Player getBoxingTopPlayer(PartyFFA partyFFA, int rank) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/RematchRequest.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/RematchRequest.java index 504f19257..f47f2f6ae 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/RematchRequest.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/match/util/RematchRequest.java @@ -14,11 +14,9 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.manager.server.ServerManager; import dev.nandi0813.practice.util.Common; import lombok.Getter; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -33,6 +31,7 @@ public class RematchRequest { private final int rounds; private boolean isRequested = false; + private boolean invalidated = false; public RematchRequest(Match match) { this.players.addAll(match.getPlayers()); @@ -44,9 +43,15 @@ public RematchRequest(Match match) { } public void sendRematchRequest(Player sender) { + if (invalidated) { + return; + } + Player target = getOtherPlayer(sender); - if (!target.isOnline()) { - Common.sendMMMessage(sender, LanguageManager.getString("MATCH.REMATCH-REQUEST.TARGET-OFFLINE").replace("%target%", target.getName())); + if (target == null || !target.isOnline()) { + String targetName = target != null ? target.getName() : "Unknown"; + Common.sendMMMessage(sender, LanguageManager.getString("MATCH.REMATCH-REQUEST.TARGET-OFFLINE").replace("%target%", targetName)); + MatchManager.getInstance().invalidateRematch(this); return; } @@ -63,7 +68,8 @@ public void sendRematchRequest(Player sender) { return; } - DuelRequest request = new DuelRequest(sender, target, ladder, null, rounds); + DuelRequest request = new DuelRequest(sender, target, ladder, null, rounds, + () -> MatchManager.getInstance().invalidateRematch(this)); DuelManager.getInstance().sendRequest(request); isRequested = true; @@ -81,8 +87,12 @@ public Player getOtherPlayer(Player player) { public void setInventories() { Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { + if (invalidated) { + return; + } + for (Player player : this.players) { - if (!player.isOnline()) return; + if (!player.isOnline()) continue; Inventory inventory = InventoryManager.getInstance().getPlayerInventory(player); if (inventory instanceof LobbyInventory lobbyInventory) { @@ -95,23 +105,34 @@ public void setInventories() { public void startRunnable() { Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - MatchManager.getInstance().getRematches().remove(this); + MatchManager.getInstance().invalidateRematch(this); + }, + ConfigManager.getInt("MATCH-SETTINGS.REMATCH.EXPIRE-TIME") * 20L); + } - for (Player player : players) { - if (!player.isOnline()) return; + public synchronized void invalidate() { + if (invalidated) { + return; + } - Profile profile = ProfileManager.getInstance().getProfile(player); - if (!profile.getStatus().equals(ProfileStatus.LOBBY)) return; + invalidated = true; - Location lobby = ServerManager.getLobby(); - if (lobby != null && lobby.getWorld() != null && !player.getLocation().getWorld().equals(lobby.getWorld())) { - return; - } + for (Player player : players) { + if (!player.isOnline()) { + continue; + } - InventoryManager.getInstance().setLobbyInventory(player, false); - } - }, - ConfigManager.getInt("MATCH-SETTINGS.REMATCH.EXPIRE-TIME") * 20L); + Profile profile = ProfileManager.getInstance().getProfile(player); + if (profile == null) { + continue; + } + + Inventory inventory = InventoryManager.getInstance().getPlayerInventory(player); + if (inventory instanceof LobbyInventory lobbyInventory + && (profile.getStatus().equals(ProfileStatus.LOBBY) || profile.getStatus().equals(ProfileStatus.SPECTATE))) { + lobbyInventory.removeRematchItem(player); + } + } } } diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/BedUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/BedUtil.java similarity index 73% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/BedUtil.java rename to core/src/main/java/dev/nandi0813/practice/manager/fight/util/BedUtil.java index bc3312c0b..fad8a5097 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/BedUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/BedUtil.java @@ -1,11 +1,10 @@ -package dev.nandi0813.practice_modern.interfaces; +package dev.nandi0813.practice.manager.fight.util; import dev.nandi0813.practice.manager.arena.util.BedLocation; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.enums.TeamEnum; import dev.nandi0813.practice.manager.fight.match.interfaces.Team; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -19,10 +18,9 @@ import java.util.Map; -public class BedUtil extends dev.nandi0813.practice.module.interfaces.BedUtil { +public class BedUtil { - @Override - public BedLocation getBedLocation(Block block) { + public static BedLocation getBedLocation(Block block) { if (block == null) return null; Location bedLoc = block.getLocation(); @@ -34,16 +32,15 @@ public BedLocation getBedLocation(Block block) { return new BedLocation(bedLoc.getWorld(), bedLoc.getX(), bedLoc.getY(), bedLoc.getZ(), bed.getFacing()); } - @Override - public void placeBed(Location loc, BlockFace face) { + public static void placeBed(Location loc, BlockFace face) { Block bedFoot = loc.getBlock(); - bedFoot.setType(Material.RED_BED); + bedFoot.setBlockData(Material.RED_BED.createBlockData()); Bed bedFootData = (Bed) Bukkit.createBlockData(Material.RED_BED); bedFootData.setPart(Bed.Part.FOOT); bedFootData.setFacing(face); Block bedHead = bedFoot.getRelative(face); - bedHead.setType(Material.RED_BED); + bedHead.setBlockData(Material.RED_BED.createBlockData()); Bed bedHeadData = (Bed) Bukkit.createBlockData(Material.RED_BED); bedHeadData.setPart(Bed.Part.HEAD); bedHeadData.setFacing(face); @@ -52,8 +49,7 @@ public void placeBed(Location loc, BlockFace face) { bedHead.setBlockData(bedHeadData, false); } - @Override - public boolean onBedBreak(final @NotNull BlockBreakEvent e, final @NotNull Match match) { + public static boolean onBedBreak(final @NotNull BlockBreakEvent e, final @NotNull Match match) { Player player = e.getPlayer(); if (match.getCurrentStat(player).isSet()) return false; @@ -100,13 +96,28 @@ public boolean onBedBreak(final @NotNull BlockBreakEvent e, final @NotNull Match BedLocation bedLocation = getBedLocation(e.getBlock()); Block head = bedLocation.getBlock().getRelative(bedLocation.getFacing()); - match.addBlockChange(ClassImport.createChangeBlock(bedLocation.getBlock())); + match.addBlockChange(new ChangedBlock(bedLocation.getBlock())); - head.setType(Material.AIR); - bedLocation.getBlock().setType(Material.AIR); + head.setBlockData(Material.AIR.createBlockData()); + bedLocation.getBlock().setBlockData(Material.AIR.createBlockData()); } return destroy; } + private static void sendBedDestroyMessage(Match match, TeamEnum team) { + String languagePath = switch (match.getLadder().getType()) { + case BEDWARS -> "MATCH." + match.getType().getPathName() + ".LADDER-SPECIFIC.BED-WARS"; + case FIREBALL_FIGHT -> "MATCH." + match.getType().getPathName() + ".LADDER-SPECIFIC.FIREBALL-FIGHT"; + default -> null; + }; + + if (languagePath == null) return; + + match.sendMessage(LanguageManager.getString(languagePath + ".BED-DESTROYED") + .replace("%team%", team.getNameMM()) + .replace("%teamColor%", team.getColorMM()) + , true); + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/BlockUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/BlockUtil.java index 2f389a302..e3df6cb00 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/BlockUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/BlockUtil.java @@ -1,13 +1,11 @@ package dev.nandi0813.practice.manager.fight.util; -import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.fight.ffa.game.FFA; import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.interfaces.Spectatable; import org.bukkit.block.Block; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.metadata.Metadatable; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; public enum BlockUtil { ; @@ -15,14 +13,14 @@ public enum BlockUtil { public static void breakBlock(Match match, Block block) { if (match == null) return; - match.addBlockChange(ClassImport.createChangeBlock(block)); + match.addBlockChange(new ChangedBlock(block)); block.breakNaturally(); } public static void breakBlock(FFA ffa, Block block) { if (ffa == null) return; - ffa.getFightChange().addBlockChange(ClassImport.createChangeBlock(block)); + ffa.getFightChange().addBlockChange(new ChangedBlock(block)); block.breakNaturally(); } @@ -38,13 +36,40 @@ public static void breakBlock(Spectatable spectatable, Block block) { } } - public static MetadataValue getMetadata(Metadatable metadatable, String tag) { - for (MetadataValue mv : metadatable.getMetadata(tag)) { - if (mv != null && mv.getOwningPlugin() == ZonePractice.getInstance()) { - return mv; - } - } - return null; + public static void setMetadata(Block block, String tag, Object value) { + PersistentTagUtil.setBlockTag(block, tag, value); + } + + public static void setMetadata(Entity entity, String tag, Object value) { + PersistentTagUtil.setEntityTag(entity, tag, value); + } + + public static T getMetadata(Block block, String tag, Class type) { + return PersistentTagUtil.getBlockTag(block, tag, type); + } + + public static T getMetadata(Entity entity, String tag, Class type) { + return PersistentTagUtil.getEntityTag(entity, tag, type); + } + + public static T getMetadata(Item item, String tag, Class type) { + return PersistentTagUtil.getTag(item, tag, type); + } + + public static boolean hasMetadata(Block block, String tag) { + return PersistentTagUtil.hasBlockTag(block, tag); + } + + public static boolean hasMetadata(Entity entity, String tag) { + return PersistentTagUtil.hasEntityTag(entity, tag); + } + + public static boolean hasMetadata(Item item, String tag) { + return PersistentTagUtil.hasTag(item, tag); + } + + public static void clearMetadata(Block block, String tag) { + PersistentTagUtil.clearBlockTag(block, tag); } } diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ChangedBlock.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ChangedBlock.java similarity index 61% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ChangedBlock.java rename to core/src/main/java/dev/nandi0813/practice/manager/fight/util/ChangedBlock.java index 868295a47..5a19844be 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ChangedBlock.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ChangedBlock.java @@ -1,37 +1,64 @@ -package dev.nandi0813.practice_modern.interfaces; +package dev.nandi0813.practice.manager.fight.util; import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; +import lombok.Getter; +import lombok.Setter; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Bed; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.inventory.ItemStack; -public class ChangedBlock extends dev.nandi0813.practice.module.interfaces.ChangedBlock { +public class ChangedBlock { + + @Getter + public final Block block; + @Getter + public final Material material; + @Getter + public Location location; + + public ItemStack[] chestInventory; + @Setter + public BlockFace bedFace; private final BlockData blockData; - public ChangedBlock(Block block) { - super(block); + public ChangedBlock(final Block block) { + this.block = block; + this.location = block.getLocation(); + this.material = block.getType(); + + saveChest(this.location); + saveBed(this.location); this.blockData = block.getBlockData(); } - public ChangedBlock(Block block, Material originalMaterial) { - super(block, originalMaterial); - // Block is already AIR/changed; use the default BlockData for the original material + /** + * Constructor for when the block has already changed in the world but we know its original material. + * Used for TNT blocks that became TNTPrimed entities before the explosion event fires. + */ + public ChangedBlock(final Block block, final Material originalMaterial) { + this.block = block; + this.location = block.getLocation(); + this.material = originalMaterial; + // No chest/bed state to save — the block is already gone this.blockData = org.bukkit.Bukkit.createBlockData(originalMaterial); } public ChangedBlock(final BlockPlaceEvent e) { - super(e); + this.block = e.getBlockPlaced(); + this.location = block.getLocation(); + this.material = e.getBlockReplacedState().getType(); this.blockData = e.getBlockReplacedState().getBlockData(); } - protected void saveChest(Location loc) { + private void saveChest(Location loc) { try { Block block = loc.getBlock(); @@ -44,7 +71,7 @@ protected void saveChest(Location loc) { } } - protected void saveBed(Location loc) { + private void saveBed(Location loc) { Block block = loc.getBlock(); if (block.getType().toString().contains("_BED")) { @@ -61,14 +88,14 @@ public void reset() { if (location == null) return; if (bedFace != null) { - ClassImport.getClasses().getBedUtil().placeBed(location, bedFace); + BedUtil.placeBed(location, bedFace); return; } Block currentBlock = location.getBlock(); try { - currentBlock.setType(material); + currentBlock.setBlockData(material.createBlockData()); currentBlock.setBlockData(blockData); currentBlock.getState().setType(material); currentBlock.getState().setBlockData(blockData); @@ -83,7 +110,7 @@ public void reset() { } catch (Exception e) { // Handle BlockData compatibility issues // Just set the block type without the problematic block data - currentBlock.setType(material); + currentBlock.setBlockData(material.createBlockData()); currentBlock.getState().setType(material); currentBlock.getState().update(); } diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/EntityHider.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/EntityHider.java similarity index 92% rename from core/src/main/java/dev/nandi0813/practice/module/interfaces/EntityHider.java rename to core/src/main/java/dev/nandi0813/practice/manager/fight/util/EntityHider.java index 0094a8da9..a26fedf41 100644 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/EntityHider.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/EntityHider.java @@ -1,4 +1,4 @@ -package dev.nandi0813.practice.module.interfaces; +package dev.nandi0813.practice.manager.fight.util; import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.event.PacketListener; @@ -21,7 +21,7 @@ import java.util.Map; -public abstract class EntityHider implements Listener { +public class EntityHider implements Listener { protected Table observerEntityMap = HashBasedTable.create(); @@ -197,7 +197,14 @@ public void onPacketSend(@NonNull PacketSendEvent event) { * @param observer - the observer. * @param entity - the entity to show. */ - public abstract void showEntity(Player observer, Entity entity); + public void showEntity(Player observer, Entity entity) { + validate(observer, entity); + boolean hiddenBefore = !setVisibility(observer, entity.getEntityId(), true); + + // Resend packets + if (hiddenBefore) + observer.showEntity(plugin, entity); + } /** * Prevent the observer from seeing a given entity. @@ -205,7 +212,13 @@ public void onPacketSend(@NonNull PacketSendEvent event) { * @param observer - the player observer. * @param entity - the entity to hide. */ - public abstract void hideEntity(Player observer, Entity entity); + public void hideEntity(Player observer, Entity entity) { + validate(observer, entity); + boolean visibleBefore = setVisibility(observer, entity.getEntityId(), false); + + if (visibleBefore) + observer.hideEntity(plugin, entity); + } /** * Determine if the given entity has been hidden from an observer. diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/FightUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/FightUtil.java index bd580bc2e..03173cb1a 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/FightUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/FightUtil.java @@ -4,6 +4,7 @@ import dev.nandi0813.practice.manager.fight.ffa.FFAManager; import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.util.interfaces.Spectatable; +import org.bukkit.damage.DamageType; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.Fireball; @@ -42,7 +43,7 @@ public static List getSpectatables() { /** * Returns only the active Spectatables that have build mechanics enabled. - * Used by {@link dev.nandi0813.practice.manager.fight.listener.BuildBlockListener} + * Used by {@link dev.nandi0813.practice.manager.fight.listener.BuildListener} * to quickly find the owner of a block change without iterating all contexts. */ public static List getActiveBuildSpectatables() { @@ -55,4 +56,33 @@ public static List getActiveBuildSpectatables() { return result; } + public static DeathCause convert(DamageType damageType) { + if (damageType == null) { + return DeathCause.DEFAULT; + } + + if (damageType.equals(DamageType.IN_FIRE) || damageType.equals(DamageType.ON_FIRE) || + damageType.equals(DamageType.CAMPFIRE) || damageType.equals(DamageType.HOT_FLOOR)) { + return DeathCause.FIRE; + } else if (damageType.equals(DamageType.LAVA)) { + return DeathCause.LAVA; + } else if (damageType.equals(DamageType.DROWN)) { + return DeathCause.WATER; + } else if (damageType.equals(DamageType.FALL) || damageType.equals(DamageType.STALAGMITE)) { + return DeathCause.FALL; + } else if (damageType.equals(DamageType.EXPLOSION) || damageType.equals(DamageType.PLAYER_EXPLOSION)) { + return DeathCause.EXPLOSION; + } else if (damageType.equals(DamageType.MOB_ATTACK) || damageType.equals(DamageType.PLAYER_ATTACK) + || damageType.equals(DamageType.MACE_SMASH)) { + return DeathCause.PLAYER_ATTACK; + } else if (damageType.equals(DamageType.ARROW) || damageType.equals(DamageType.TRIDENT) || + damageType.equals(DamageType.MOB_PROJECTILE)) { + return DeathCause.PLAYER_PROJECTILE; + } else if (damageType.equals(DamageType.OUT_OF_WORLD)) { + return DeathCause.VOID; + } else { + return DeathCause.DEFAULT; + } + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ListenerUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ListenerUtil.java index 27e7ef283..b3d1ffe2e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ListenerUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ListenerUtil.java @@ -5,7 +5,6 @@ import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; import org.bukkit.entity.Player; -import org.bukkit.metadata.MetadataValue; public enum ListenerUtil { ; @@ -25,7 +24,7 @@ public static int getCalculatedBuildLimit(BasicArena arena) { buildLimit = arena.getBuildMaxValue(); else { if (arena instanceof FFAArena) { - buildLimit = arena.getFfaPositions().get(0).getBlockY() + arena.getBuildMaxValue(); + buildLimit = arena.getFfaPositions().getFirst().getBlockY() + arena.getBuildMaxValue(); } else { buildLimit = arena.getPosition1().getBlockY() + arena.getBuildMaxValue(); } @@ -34,8 +33,8 @@ public static int getCalculatedBuildLimit(BasicArena arena) { return buildLimit; } - public static boolean checkMetaData(MetadataValue metadataValue) { - return metadataValue == null || metadataValue.value() == null; + public static boolean checkMetaData(Object metadataValue) { + return metadataValue == null; } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ModernItemCooldownHandler.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ModernItemCooldownHandler.java new file mode 100644 index 000000000..40c6ad2a3 --- /dev/null +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/ModernItemCooldownHandler.java @@ -0,0 +1,51 @@ +package dev.nandi0813.practice.manager.fight.util; + +import dev.nandi0813.practice.ZonePractice; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; + +public class ModernItemCooldownHandler { + + public static void handleEnderPearl(Player player, int duration, Cancellable event) { + if (player.hasCooldown(Material.ENDER_PEARL)) { + if (event != null) { + event.setCancelled(true); + } + } else { + player.setCooldown(Material.ENDER_PEARL, duration * 20); + } + } + + public static void handleGoldenApple(Player player, int duration, Cancellable event) { + if (player.hasCooldown(Material.GOLDEN_APPLE)) { + if (event != null) { + event.setCancelled(true); + } + } else { + player.setCooldown(Material.GOLDEN_APPLE, duration * 20); + } + } + + public static void handleFireworkRocket(Player player, int duration, Cancellable event) { + Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { + if (player.hasCooldown(Material.FIREWORK_ROCKET)) { + if (event != null) { + event.setCancelled(true); + } + } else { + player.setCooldown(Material.FIREWORK_ROCKET, duration * 20); + } + }, 2L); + } + + public static boolean handleFireballMatch(Player player, double duration) { + if (player.hasCooldown(Material.FIRE_CHARGE)) { + return false; + } else { + player.setCooldown(Material.FIRE_CHARGE, (int) (duration * 20)); + return true; + } + } +} diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/PersistentTagUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/PersistentTagUtil.java new file mode 100644 index 000000000..68e507ebc --- /dev/null +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/PersistentTagUtil.java @@ -0,0 +1,100 @@ +package dev.nandi0813.practice.manager.fight.util; + +import dev.nandi0813.practice.ZonePractice; +import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataHolder; +import org.bukkit.persistence.PersistentDataType; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Runtime tag bridge that stores identifiers in PersistentDataContainer and keeps + * associated live objects in-memory for the current server session. + */ +public enum PersistentTagUtil { + ; + + private static final Map OBJECT_REGISTRY = new ConcurrentHashMap<>(); + private static final Map BLOCK_TAGS = new ConcurrentHashMap<>(); + + private static NamespacedKey key(String tag) { + return new NamespacedKey(ZonePractice.getInstance(), "zpp_" + tag.toLowerCase()); + } + + private static String register(Object value) { + String token = UUID.randomUUID().toString(); + OBJECT_REGISTRY.put(token, value); + return token; + } + + public static void setTag(PersistentDataHolder holder, String tag, Object value) { + String token = register(value); + holder.getPersistentDataContainer().set(key(tag), PersistentDataType.STRING, token); + } + + public static T getTag(PersistentDataHolder holder, String tag, Class type) { + PersistentDataContainer container = holder.getPersistentDataContainer(); + String token = container.get(key(tag), PersistentDataType.STRING); + if (token == null) { + return null; + } + + Object value = OBJECT_REGISTRY.get(token); + if (!type.isInstance(value)) { + return null; + } + return type.cast(value); + } + + public static boolean hasTag(PersistentDataHolder holder, String tag) { + return holder.getPersistentDataContainer().has(key(tag), PersistentDataType.STRING); + } + + public static void setBlockTag(Block block, String tag, Object value) { + String blockKey = blockKey(block, tag); + BLOCK_TAGS.put(blockKey, register(value)); + } + + public static T getBlockTag(Block block, String tag, Class type) { + String token = BLOCK_TAGS.get(blockKey(block, tag)); + if (token == null) { + return null; + } + + Object value = OBJECT_REGISTRY.get(token); + if (!type.isInstance(value)) { + return null; + } + return type.cast(value); + } + + public static boolean hasBlockTag(Block block, String tag) { + return BLOCK_TAGS.containsKey(blockKey(block, tag)); + } + + public static void clearBlockTag(Block block, String tag) { + BLOCK_TAGS.remove(blockKey(block, tag)); + } + + public static void setEntityTag(Entity entity, String tag, Object value) { + setTag(entity, tag, value); + } + + public static T getEntityTag(Entity entity, String tag, Class type) { + return getTag(entity, tag, type); + } + + public static boolean hasEntityTag(Entity entity, String tag) { + return hasTag(entity, tag); + } + + private static String blockKey(Block block, String tag) { + return block.getWorld().getUID() + ":" + block.getX() + ":" + block.getY() + ":" + block.getZ() + ":" + tag; + } +} + diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/PlayerUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/PlayerUtil.java similarity index 70% rename from spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/PlayerUtil.java rename to core/src/main/java/dev/nandi0813/practice/manager/fight/util/PlayerUtil.java index 6b28e5578..0a933ebae 100644 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/PlayerUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/PlayerUtil.java @@ -1,6 +1,7 @@ -package dev.nandi0813.practice_modern.interfaces; +package dev.nandi0813.practice.manager.fight.util; import dev.nandi0813.practice.ZonePractice; +import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.util.StringUtil; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -16,23 +17,25 @@ import java.util.ArrayList; import java.util.List; -public class PlayerUtil implements dev.nandi0813.practice.module.interfaces.PlayerUtil { +public class PlayerUtil { - @Override - public ItemStack getPlayerMainHand(Player player) { + private static final double TNT_VELOCITY_HORIZONTAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.TNT.HORIZONTAL"); + private static final double TNT_VELOCITY_VERTICAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.TNT.VERTICAL"); + private static final double FB_VELOCITY_HORIZONTAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.FIREBALL.HORIZONTAL"); + private static final double FB_VELOCITY_VERTICAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.FIREBALL.VERTICAL"); + + public static ItemStack getPlayerMainHand(Player player) { return player.getInventory().getItemInMainHand(); } - @Override - public boolean isItemInUse(Player player, Material material) { + public static boolean isItemInUse(Player player, Material material) { ItemStack itemInMainHand = player.getInventory().getItemInMainHand(); ItemStack itemInOffHand = player.getInventory().getItemInOffHand(); return itemInMainHand.getType().equals(material) || itemInOffHand.getType().equals(material); } - @Override - public ItemStack getItemInUse(Player player, Material material) { + public static ItemStack getItemInUse(Player player, Material material) { ItemStack itemInMainHand = player.getInventory().getItemInMainHand(); ItemStack itemInOffHand = player.getInventory().getItemInOffHand(); @@ -41,8 +44,7 @@ public ItemStack getItemInUse(Player player, Material material) { return null; } - @Override - public void setItemInUseIf(Player player, Material material, ItemStack itemStack) { + public static void setItemInUseIf(Player player, Material material, ItemStack itemStack) { if (player.getInventory().getItemInMainHand().getType().equals(material)) { player.getInventory().setItemInMainHand(itemStack); } @@ -51,8 +53,7 @@ public void setItemInUseIf(Player player, Material material, ItemStack itemStack } } - @Override - public List dropPlayerInventory(Player player) { + public static List dropPlayerInventory(Player player) { List entities = new ArrayList<>(); for (ItemStack item : player.getInventory().getContents()) { @@ -61,53 +62,62 @@ public List dropPlayerInventory(Player player) { entities.add(player.getWorld().dropItemNaturally(player.getLocation(), item)); } - this.clearInventory(player); + // Drop items from the 2x2 crafting grid (indices 1-4 of the open inventory) + for (int i = 1; i <= 4; i++) { + ItemStack item = player.getOpenInventory().getItem(i); + if (item == null || item.getType().equals(Material.AIR)) continue; + entities.add(player.getWorld().dropItemNaturally(player.getLocation(), item)); + } + // Drop cursor item if any + ItemStack cursor = player.getItemOnCursor(); + if (cursor != null && !cursor.getType().equals(Material.AIR)) + entities.add(player.getWorld().dropItemNaturally(player.getLocation(), cursor)); + + clearInventory(player); return entities; } - public void clearInventory(Player player) { + public static void clearInventory(Player player) { player.getInventory().clear(); + // Clear the 2x2 crafting grid slots (indices 1-4 of the player's open inventory) + for (int i = 1; i <= 4; i++) + player.getOpenInventory().setItem(i, null); + // Clear any item held on the cursor + player.setItemOnCursor(null); } - public void setCollidesWithEntities(Player player, boolean bool) { + public static void setCollidesWithEntities(Player player, boolean bool) { player.setCollidable(bool); } - @Override - public int getPing(Player player) { + public static int getPing(Player player) { return player.getPing(); } - @Override - public ItemStack[] getInventoryStorageContent(Player player) { + public static ItemStack[] getInventoryStorageContent(Player player) { return player.getInventory().getStorageContents(); } - @Override - public double getPlayerHealth(Player player) { + public static double getPlayerHealth(Player player) { return player.getHealth() + player.getAbsorptionAmount(); } - @Override - public void setActiveInventoryTitle(Player player, String title) { + public static void setActiveInventoryTitle(Player player, String title) { player.getOpenInventory().setTitle(StringUtil.CC(title)); } - @Override - public void setPlayerListName(Player player, Component component) { + public static void setPlayerListName(Player player, Component component) { player.playerListName(component); } - @Override - public Fireball shootFireball(Player player, double speed) { + public static Fireball shootFireball(Player player, double speed) { final Fireball fireball = player.launchProjectile(Fireball.class); fireball.setAcceleration(fireball.getAcceleration().normalize().multiply(speed)); return fireball; } - @Override - public void applyFireballKnockback(final Player player, final Fireball fireball) { + public static void applyFireballKnockback(final Player player, final Fireball fireball) { final Location playerLoc = player.getLocation(); final Location fireballLoc = fireball.getLocation(); @@ -172,8 +182,7 @@ public void applyFireballKnockback(final Player player, final Fireball fireball) }, 1L); } - @Override - public void applyTntKnockback(Player player, TNTPrimed tnt) { + public static void applyTntKnockback(Player player, TNTPrimed tnt) { final Location playerLoc = player.getLocation(); final Location tntLoc = tnt.getLocation(); final float yield = tnt.getYield(); @@ -205,8 +214,7 @@ public void applyTntKnockback(Player player, TNTPrimed tnt) { }, 1L); } - @Override - public void setAttackSpeed(Player player, int hitDelay) { + public static void setAttackSpeed(Player player, int hitDelay) { // ...existing code... org.bukkit.attribute.AttributeInstance attackSpeed = player.getAttribute(org.bukkit.attribute.Attribute.ATTACK_SPEED); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/Stats/Statistic.java b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/Stats/Statistic.java index ca00ded88..ecfa1d867 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/fight/util/Stats/Statistic.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/fight/util/Stats/Statistic.java @@ -1,6 +1,6 @@ package dev.nandi0813.practice.manager.fight.util.Stats; -import dev.nandi0813.practice.module.interfaces.StatisticListener; +import dev.nandi0813.practice.listener.StatisticListener; import dev.nandi0813.practice.util.NumberUtil; import lombok.Getter; import lombok.Setter; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIItem.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIItem.java index 3e7eda19f..6ff731631 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIItem.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIItem.java @@ -1,8 +1,8 @@ package dev.nandi0813.practice.manager.gui; -import dev.nandi0813.practice.module.interfaces.ItemCreateUtil; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.ladder.util.LadderUtil; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.ItemCreateUtil; import dev.nandi0813.practice.util.StringUtil; import lombok.Getter; import lombok.Setter; @@ -10,12 +10,11 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; public class GUIItem { @@ -91,12 +90,20 @@ public GUIItem(ItemStack itemStack) { ItemMeta itemMeta = itemStack.getItemMeta(); if (itemMeta != null) { - this.name = itemMeta.getDisplayName(); - this.lore = itemMeta.getLore(); + if (itemMeta.hasDisplayName() && itemMeta.displayName() != null) { + this.name = Common.serializeComponentToLegacyString(itemMeta.displayName()); + } + if (itemMeta.lore() != null) { + this.lore = Objects.requireNonNull(itemMeta.lore()).stream() + .map(Common::serializeComponentToLegacyString) + .collect(Collectors.toList()); + } this.glowing = itemMeta.hasEnchants(); + if (itemMeta instanceof Damageable damageable) { + this.damage = (short) damageable.getDamage(); + } } this.amount = itemStack.getAmount(); - this.damage = itemStack.getDurability(); this.material = itemStack.getType(); // Preserve the full ItemStack so special meta (e.g. PotionMeta) is not lost this.baseItemStack = itemStack.clone(); @@ -130,31 +137,38 @@ public ItemStack get() { } else if (damage == -1) { itemStack = new ItemStack(material, amount); } else { - itemStack = new ItemStack(material, amount, damage); + itemStack = new ItemStack(material, amount); } if (durability > 0) { - ClassImport.getClasses().getLadderUtil().setDurability(itemStack, durability); + LadderUtil.setDurability(itemStack, durability); } } ItemMeta itemMeta = itemStack.getItemMeta(); if (itemMeta != null) { + if (damage != -1 && itemMeta instanceof Damageable damageable) { + damageable.setDamage(damage); + itemMeta = damageable; + } + if (name != null) { - itemMeta.setDisplayName(StringUtil.CC(name)); + itemMeta.displayName(Common.legacyToComponent(StringUtil.CC(name))); } if (lore != null) { - itemMeta.setLore(StringUtil.CC(lore)); + itemMeta.lore(StringUtil.CC(lore).stream() + .map(Common::legacyToComponent) + .collect(Collectors.toList())); } if (glowing && enchantments.isEmpty()) { - itemMeta.addEnchant(Enchantment.DURABILITY, 1, true); + itemMeta.addEnchant(Enchantment.UNBREAKING, 1, true); } // Apply unbreakable status if set (for modern versions to prevent durability bars) if (unbreakable) { - itemMeta = ClassImport.getClasses().getLadderUtil().setUnbreakable(itemMeta, true); + itemMeta = LadderUtil.setUnbreakable(itemMeta, true); } if (!itemFlags.isEmpty()) { @@ -182,17 +196,24 @@ public ItemStack getForPlayerKit() { } else if (damage == -1) { itemStack = new ItemStack(material, amount); } else { - itemStack = new ItemStack(material, amount, damage); + itemStack = new ItemStack(material, amount); } ItemMeta itemMeta = itemStack.getItemMeta(); if (itemMeta != null) { + if (damage != -1 && itemMeta instanceof Damageable damageable) { + damageable.setDamage(damage); + itemMeta = damageable; + } + if (name != null) { - itemMeta.setDisplayName(StringUtil.CC(name)); + itemMeta.displayName(Common.legacyToComponent(StringUtil.CC(name))); } if (lore != null) { - itemMeta.setLore(StringUtil.CC(lore)); + itemMeta.lore(StringUtil.CC(lore).stream() + .map(Common::legacyToComponent) + .collect(Collectors.toList())); } itemStack.setItemMeta(itemMeta); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIManager.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIManager.java index e6ad57495..5b70ff95e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIManager.java @@ -7,7 +7,7 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.util.ItemCreateUtil; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -43,7 +43,7 @@ public static GUIManager getInstance() { @Getter private static final ItemStack FILLER_ITEM = GUIFile.getGuiItem("GENERAL-FILLER-ITEM").get(); @Getter - private static final ItemStack DUMMY_ITEM = ClassImport.getClasses().getItemCreateUtil().createItem("DUMMY", Material.GLOWSTONE_DUST); + private static final ItemStack DUMMY_ITEM = ItemCreateUtil.createItem("DUMMY", Material.GLOWSTONE_DUST); private GUIManager() { Bukkit.getPluginManager().registerEvents(this, ZonePractice.getInstance()); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIType.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIType.java index 0a27f79e0..45662fb8f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIType.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/GUIType.java @@ -93,6 +93,7 @@ public enum GUIType { DivisionGui, + FFA_Arena_Selector, FFA_Ladder_Selector, } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchStatsGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchStatsGui.java index 28bdb2d9d..512b72e5a 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchStatsGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/MatchStatsGui.java @@ -7,6 +7,7 @@ import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.gui.GUI; import dev.nandi0813.practice.manager.gui.GUIType; +import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; import dev.nandi0813.practice.util.StringUtil; import org.apache.commons.lang3.StringUtils; @@ -35,8 +36,11 @@ public MatchStatsGui(Match match, UUID uuid) { this.uuid = uuid; this.player = Bukkit.getOfflinePlayer(uuid); - for (Round round : match.getRounds().values()) - stats.put(round.getRoundNumber(), round.getStatistics().get(uuid)); + for (Round round : match.getRounds().values()) { + Statistic statistic = round.getStatistics().get(uuid); + if (statistic != null) + stats.put(round.getRoundNumber(), statistic); + } build(); } @@ -56,9 +60,9 @@ public void update() { while (stats.containsKey(round)) { String title; if (match.getLadder().getRounds() == 1) - title = GUIFile.getString("GUIS.MATCH-STATISTICS.TITLE.SINGLE-ROUND").replace("%player%", player.getName()); + title = GUIFile.getString("GUIS.MATCH-STATISTICS.TITLE.SINGLE-ROUND").replace("%player%", Objects.requireNonNull(player.getName())); else - title = GUIFile.getString("GUIS.MATCH-STATISTICS.TITLE.MULTIPLE-ROUND").replace("%player%", player.getName()).replace("%round%", String.valueOf(round)); + title = GUIFile.getString("GUIS.MATCH-STATISTICS.TITLE.MULTIPLE-ROUND").replace("%player%", Objects.requireNonNull(player.getName())).replace("%round%", String.valueOf(round)); gui.put(round, InventoryUtil.createInventory(title, 6)); Statistic roundStatistic = stats.get(round); @@ -75,7 +79,7 @@ public void update() { if (i < 27) inventory.setItem(i, inventoryContent.get(i + 9)); else inventory.setItem(i, firstLine.get(i - 27)); - if (inventoryContent.get(i) != null && inventoryContent.get(i).getType().equals(Material.POTION) && inventoryContent.get(i).getDurability() == 16421) + if (inventoryContent.get(i) != null && inventoryContent.get(i).getType().equals(Material.POTION) && Common.getItemDamage(inventoryContent.get(i)) == 16421) healthPotionsLeft++; } @@ -140,7 +144,7 @@ private ItemStack getEffectItem(Statistic roundStatistic) { List effects = new ArrayList<>(); for (PotionEffect potionEffect : roundStatistic.getEndPotionEffects()) { effects.add(GUIFile.getString("GUIS.MATCH-STATISTICS.ICONS.EFFECT.HAS-EFFECT.FORMAT") - .replace("%name%", StringUtils.capitalize(potionEffect.getType().getName().replace("_", " ").toLowerCase())) + .replace("%name%", StringUtils.capitalize(potionEffect.getType().getKey().getKey().replace("_", " ").toLowerCase())) .replace("%amplifier%", String.valueOf(potionEffect.getAmplifier() + 1)) .replace("%time%", StringUtil.formatMillisecondsToMinutes((potionEffect.getDuration() / 20) * 1000L)) ); @@ -157,7 +161,7 @@ private ItemStack getEffectItem(Statistic roundStatistic) { ItemStack item = GUIFile.getGuiItem("GUIS.MATCH-STATISTICS.ICONS.EFFECT.HAS-EFFECT.ICON").get(); ItemMeta itemMeta = item.getItemMeta(); - itemMeta.setLore(lore); + itemMeta.lore(StringUtil.CC(lore).stream().map(Common::legacyToComponent).toList()); item.setItemMeta(itemMeta); return item; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/PlayerInvGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/PlayerInvGui.java index 2c74c6faf..a968bea03 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/PlayerInvGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/PlayerInvGui.java @@ -90,7 +90,7 @@ private ItemStack getEffectItem() { List effects = new ArrayList<>(); for (PotionEffect potionEffect : target.getActivePotionEffects()) { effects.add(GUIFile.getString("GUIS.PLAYER-INVENTORY.ICONS.EFFECT.FORMAT") - .replace("%name%", StringUtils.capitalize(potionEffect.getType().getName().replace("_", " ").toLowerCase())) + .replace("%name%", StringUtils.capitalize(potionEffect.getType().getKey().getKey().replace("_", " ").toLowerCase())) .replace("%amplifier%", String.valueOf(potionEffect.getAmplifier() + 1)) .replace("%time%", StringUtil.formatMillisecondsToMinutes((potionEffect.getDuration() / 20) * 1000L)) ); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/arena/ArenaCreateGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/arena/ArenaCreateGui.java index a3a7a56b6..a902d4845 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/arena/ArenaCreateGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/arena/ArenaCreateGui.java @@ -13,9 +13,9 @@ import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.gui.setup.arena.ArenaGUISetupManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -61,9 +61,9 @@ public void update() { inventory.setItem(16, null); for (ArenaType type : ArenaType.values()) { - ItemStack item = ClassImport.getClasses().getItemCreateUtil().createItem("&e" + type.getName(), type.getIcon()); + ItemStack item = ItemCreateUtil.createItem("&e" + type.getName(), type.getIcon()); ItemMeta itemMeta = item.getItemMeta(); - itemMeta.setLore(type.getDescription()); + itemMeta.lore(type.getDescription().stream().map(Common::legacyToComponent).toList()); item.setItemMeta(itemMeta); int slot = inventory.firstEmpty(); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderEditorGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderEditorGui.java index 7505763c9..56ad44237 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderEditorGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderEditorGui.java @@ -5,6 +5,7 @@ import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.fight.match.enums.WeightClass; import dev.nandi0813.practice.manager.fight.match.util.CustomKit; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.gui.GUI; import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; @@ -14,15 +15,14 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.interfaces.ItemCreateUtil; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.module.util.VersionChecker; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import dev.nandi0813.practice.util.StringUtil; import dev.nandi0813.practice.util.cooldown.CooldownObject; import dev.nandi0813.practice.util.cooldown.PlayerCooldown; import lombok.Getter; +import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -122,10 +122,7 @@ public void update() { if (ladder.getCustomKitExtraItems().get(ranked) != null) { for (ItemStack item : ladder.getCustomKitExtraItems().get(ranked)) { - if (item != null) - inventory.setItem(inventory.firstEmpty(), item); - else - inventory.setItem(inventory.firstEmpty(), GUIManager.getDUMMY_ITEM()); + inventory.setItem(inventory.firstEmpty(), Objects.requireNonNullElseGet(item, GUIManager::getDUMMY_ITEM)); } } @@ -135,16 +132,14 @@ public void update() { if (inventory.getItem(i) == null) inventory.setItem(i, fillerItem); - if (Objects.requireNonNull(VersionChecker.getBukkitVersion()).isSecondHand()) { - if (customKit.getExtra() != null) { - if (customKit.getExtra().length > 0) { - inventory.setItem(14, customKit.getExtra()[0]); - } else { - inventory.setItem(14, null); - } + if (customKit.getExtra() != null) { + if (customKit.getExtra().length > 0) { + inventory.setItem(14, customKit.getExtra()[0]); } else { - inventory.setItem(14, GUIManager.getDUMMY_ITEM()); + inventory.setItem(14, null); } + } else { + inventory.setItem(14, GUIManager.getDUMMY_ITEM()); } updatePlayers(); @@ -207,14 +202,12 @@ public void handleCloseEvent(InventoryCloseEvent e) { NormalLadder ladder = customLadderEditorGui.getLadder(); if (ladder.isEnabled() && ladder.isEditable() && !ladder.isFrozen()) { - ItemStack[] inventoryStorageContent = ClassImport.getClasses().getPlayerUtil().getInventoryStorageContent(player); + ItemStack[] inventoryStorageContent = PlayerUtil.getInventoryStorageContent(player); customKit.setInventory(inventoryStorageContent); - if (Objects.requireNonNull(VersionChecker.getBukkitVersion()).isSecondHand()) { - customKit.setExtra(new ItemStack[]{this.gui.get(1).getItem(14)}); - } + customKit.setExtra(new ItemStack[]{this.gui.get(1).getItem(14)}); } - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + PlayerUtil.clearInventory(player); Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { @@ -234,7 +227,7 @@ public void open(Player player) { Profile playerProfile = ProfileManager.getInstance().getProfile(player); playerProfile.setStatus(ProfileStatus.EDITOR); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + PlayerUtil.clearInventory(player); Map kits; if (ranked) kits = profile.getRankedCustomKits().get(ladder); @@ -267,7 +260,7 @@ private ItemStack getEffectItem() { List effects = new ArrayList<>(); for (PotionEffect potionEffect : ladder.getKitData().getEffects()) { effects.add(GUIFile.getString("GUIS.KIT-EDITOR.KIT-EDITOR.ICONS.HAS-EFFECT.FORMAT") - .replace("%name%", StringUtils.capitalize(potionEffect.getType().getName().replace("_", " ").toLowerCase())) + .replace("%name%", StringUtils.capitalize(potionEffect.getType().getKey().getKey().replace("_", " ").toLowerCase())) .replace("%amplifier%", String.valueOf(potionEffect.getAmplifier() + 1)) .replace("%time%", StringUtil.formatMillisecondsToMinutes((potionEffect.getDuration() / 20) * 1000L)) ); @@ -278,11 +271,12 @@ private ItemStack getEffectItem() { ItemCreateUtil.hideItemFlags(effectItemMeta); List lore = new ArrayList<>(); - for (String line : effectItem.getItemMeta().getLore()) { + for (Component lineComponent : Objects.requireNonNull(effectItem.getItemMeta().lore())) { + String line = Common.serializeComponentToLegacyString(lineComponent); if (line.contains("%effects%")) lore.addAll(effects); else lore.add(line); } - effectItemMeta.setLore(lore); + effectItemMeta.lore(lore.stream().map(Common::legacyToComponent).toList()); effectItem.setItemMeta(effectItemMeta); return effectItem; } else { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSelectorGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSelectorGui.java index fd33610fb..4e8f84e1d 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSelectorGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSelectorGui.java @@ -9,9 +9,9 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.interfaces.ItemCreateUtil; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; @@ -48,10 +48,9 @@ public void update() { ItemStack icon = ladder.getIcon(); ItemMeta iconMeta = icon.getItemMeta(); if (iconMeta != null) { - iconMeta.setDisplayName(GUIFile.getString("GUIS.KIT-EDITOR.LADDER-SELECTOR.ICONS.NAME") + iconMeta.displayName(Common.legacyToComponent(GUIFile.getString("GUIS.KIT-EDITOR.LADDER-SELECTOR.ICONS.NAME") .replace("%ladder%", ladder.getDisplayName()) - .replace("%ladderOriginal%", ladder.getName()) - ); + .replace("%ladderOriginal%", ladder.getName()))); ItemCreateUtil.hideItemFlags(iconMeta); List lore = new ArrayList<>(); @@ -61,7 +60,7 @@ public void update() { .replace("%ladderOriginal%", ladder.getName())) ; } - iconMeta.setLore(lore); + iconMeta.lore(lore.stream().map(Common::legacyToComponent).toList()); icon.setItemMeta(iconMeta); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSumGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSumGui.java index 350f2e84b..8ce254811 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSumGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/customladder/premadecustom/CustomLadderSumGui.java @@ -3,6 +3,7 @@ import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.GUIFile; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.gui.GUI; import dev.nandi0813.practice.manager.gui.GUIItem; import dev.nandi0813.practice.manager.gui.GUIManager; @@ -12,7 +13,6 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; import org.bukkit.Bukkit; @@ -143,7 +143,7 @@ public void handleCloseEvent(InventoryCloseEvent e) { Player player = (Player) e.getPlayer(); Profile profile = ProfileManager.getInstance().getProfile(player); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + PlayerUtil.clearInventory(player); Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { @@ -164,7 +164,7 @@ public void open(Player player) { ItemStack backToItem = GUIFile.getGuiItem("GUIS.KIT-EDITOR.KIT-SELECTOR.ICONS.BACK-TO-KIT-SELECTOR").get(); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + PlayerUtil.clearInventory(player); for (int i = 0; i < 9; i++) player.getInventory().setItem(i, backToItem); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderCreateGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderCreateGui.java index a7a196a0f..2f1fd1255 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderCreateGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderCreateGui.java @@ -11,9 +11,9 @@ import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import dev.nandi0813.practice.util.StringUtil; import lombok.Getter; import org.bukkit.Bukkit; @@ -54,9 +54,9 @@ public void update() { inventory.setItem(i, GUIManager.getFILLER_ITEM()); for (LadderType type : LadderType.values()) { - ItemStack item = ClassImport.getClasses().getItemCreateUtil().createItem("&e" + type.getName(), type.getIcon()); + ItemStack item = ItemCreateUtil.createItem("&e" + type.getName(), type.getIcon()); ItemMeta itemMeta = item.getItemMeta(); - itemMeta.setLore(StringUtil.CC(type.getDescription())); + itemMeta.lore(StringUtil.CC(type.getDescription()).stream().map(Common::legacyToComponent).toList()); item.setItemMeta(itemMeta); int slot = inventory.firstEmpty(); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderPreviewGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderPreviewGui.java index 9e3494ed5..d18733cb7 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderPreviewGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/ladder/LadderPreviewGui.java @@ -6,8 +6,8 @@ import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; -import dev.nandi0813.practice.module.interfaces.KitData; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.KitData; import dev.nandi0813.practice.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; @@ -87,7 +87,7 @@ private ItemStack getEffectItem() { List effects = new ArrayList<>(); for (PotionEffect potionEffect : kitData.getEffects()) { effects.add(GUIFile.getString("GUIS.LADDER-PREVIEW.ICONS.HAS-EFFECT.FORMAT") - .replace("%name%", StringUtils.capitalize(potionEffect.getType().getName().replace("_", " ").toLowerCase())) + .replace("%name%", StringUtils.capitalize(potionEffect.getType().getKey().getKey().replace("_", " ").toLowerCase())) .replace("%amplifier%", String.valueOf(potionEffect.getAmplifier() + 1)) .replace("%time%", StringUtil.formatMillisecondsToMinutes((potionEffect.getDuration() / 20) * 1000L)) ); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java index 61517f4e2..c40bbc19f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/leaderboard/LbGuiUtil.java @@ -10,9 +10,8 @@ import dev.nandi0813.practice.manager.leaderboard.types.LbSecondaryType; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.module.interfaces.ItemCreateUtil; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.ItemCreateUtil; import dev.nandi0813.practice.util.StringUtil; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -23,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; public enum LbGuiUtil { ; @@ -30,14 +30,18 @@ public enum LbGuiUtil { // if it says not used don't listen to it, buggy public static ItemStack createProfileStatItem(Profile profile, Player opener) { String playerName = profile.getPlayer().getName(); - ItemStack itemStack = ClassImport.getClasses().getItemMaterialUtil().getPlayerHead(profile.getPlayer()); + if (playerName == null) { + playerName = "Unknown"; + } + ItemStack itemStack = ItemCreateUtil.getPlayerHead(profile.getPlayer()); ItemMeta itemMeta = itemStack.getItemMeta(); String displayName; List lore = new ArrayList<>(); if (opener.equals(profile.getPlayer())) { - for (String line : GUIFile.getStringList("GUIS.STATISTICS.SELECTOR.ICONS.OWN-PLAYER-STATS.LORE")) + for (String line : GUIFile.getStringList("GUIS.STATISTICS.SELECTOR.ICONS.OWN-PLAYER-STATS.LORE")) { lore.add(line.replace("%player%", playerName)); + } displayName = GUIFile.getString("GUIS.STATISTICS.SELECTOR.ICONS.OWN-PLAYER-STATS.NAME").replace("%player%", playerName); } else { @@ -47,8 +51,8 @@ public static ItemStack createProfileStatItem(Profile profile, Player opener) { displayName = GUIFile.getString("GUIS.STATISTICS.SELECTOR.ICONS.PLAYER-STATS.NAME").replace("%target%", playerName); } - itemMeta.setDisplayName(StringUtil.CC(displayName)); - itemMeta.setLore(StringUtil.CC(lore)); + itemMeta.displayName(Common.legacyToComponent(StringUtil.CC(displayName))); + itemMeta.lore(StringUtil.CC(lore).stream().map(Common::legacyToComponent).toList()); ItemCreateUtil.hideItemFlags(itemMeta); itemStack.setItemMeta(itemMeta); @@ -91,7 +95,7 @@ public static GUIItem createLadderStatItem(Profile profile, NormalLadder ladder) } public static ItemStack createProfileAllStatItem(Profile profile) { - ItemStack itemStack = ClassImport.getClasses().getItemMaterialUtil().getPlayerHead(profile.getPlayer()); + ItemStack itemStack = ItemCreateUtil.getPlayerHead(profile.getPlayer()); ItemMeta itemMeta = itemStack.getItemMeta(); List lore = new ArrayList<>(); @@ -112,8 +116,8 @@ public static ItemStack createProfileAllStatItem(Profile profile) { ); } - itemMeta.setDisplayName(GUIFile.getString("GUIS.STATISTICS.PLAYER-STATISTICS.ICONS.ALL-STAT.NAME").replace("%player%", profile.getPlayer().getName())); - itemMeta.setLore(StringUtil.CC(lore)); + itemMeta.displayName(Common.legacyToComponent(GUIFile.getString("GUIS.STATISTICS.PLAYER-STATISTICS.ICONS.ALL-STAT.NAME").replace("%player%", Objects.requireNonNull(profile.getPlayer().getName())))); + itemMeta.lore(StringUtil.CC(lore).stream().map(Common::legacyToComponent).toList()); itemStack.setItemMeta(itemMeta); return itemStack; } @@ -145,7 +149,7 @@ public static ItemStack createEloLbItem(NormalLadder ladder) { topStrings.add(StringUtil.CC(GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.LADDER-LEADERBOARD.LORE.FORMAT") .replace("%number%", String.valueOf(i)) - .replace("%player%", target.getName()) + .replace("%player%", Objects.requireNonNull(target.getName())) .replace("%ladder_elo%", String.valueOf(stat)) .replace("%division%", (targetProfile.getStats().getDivision() != null ? Common.mmToNormal(targetProfile.getStats().getDivision().getFullName()) : "")) .replace("%division_short%", (targetProfile.getStats().getDivision() != null ? Common.mmToNormal(targetProfile.getStats().getDivision().getShortName()) : "")) @@ -164,7 +168,7 @@ public static ItemStack createEloLbItem(NormalLadder ladder) { } } - return ClassImport.getClasses().getItemCreateUtil().createItem(ladder.getIcon(), GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.LADDER-LEADERBOARD.NAME") + return ItemCreateUtil.createItem(ladder.getIcon(), GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.LADDER-LEADERBOARD.NAME") .replace("%ladder%", ladder.getDisplayName()) .replace("%number%", String.valueOf(showPlayers)) , lore); @@ -200,7 +204,7 @@ public static ItemStack createGlobalEloLb() { .replace("%number%", String.valueOf(i)) .replace("%division%", (division != null ? Common.mmToNormal(division.getFullName()) : "")) .replace("%division_short%", (division != null ? Common.mmToNormal(division.getShortName()) : "")) - .replace("%player%", target.getName()) + .replace("%player%", Objects.requireNonNull(target.getName())) .replace("%global_elo%", String.valueOf(stat)) )); } else @@ -217,7 +221,7 @@ public static ItemStack createGlobalEloLb() { } } - return ClassImport.getClasses().getItemCreateUtil().createItem(GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.NAME").replace("%number%", String.valueOf(showPlayers)), Material.valueOf(GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.MATERIAL")), lore); + return ItemCreateUtil.createItem(GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.NAME").replace("%number%", String.valueOf(showPlayers)), Material.valueOf(GUIFile.getString("GUIS.STATISTICS.ELO-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.MATERIAL")), lore); } public static ItemStack createWinLbItem(NormalLadder ladder) { @@ -247,7 +251,7 @@ public static ItemStack createWinLbItem(NormalLadder ladder) { topStrings.add(StringUtil.CC(GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.LADDER-LEADERBOARD.LORE.FORMAT") .replace("%number%", String.valueOf(i)) - .replace("%player%", target.getName()) + .replace("%player%", Objects.requireNonNull(target.getName())) .replace("%ladder_win%", String.valueOf(stat)) .replace("%division%", (targetProfile.getStats().getDivision() != null ? Common.mmToNormal(targetProfile.getStats().getDivision().getFullName()) : "")) .replace("%division_short%", (targetProfile.getStats().getDivision() != null ? Common.mmToNormal(targetProfile.getStats().getDivision().getShortName()) : "")) @@ -266,7 +270,7 @@ public static ItemStack createWinLbItem(NormalLadder ladder) { } } - return ClassImport.getClasses().getItemCreateUtil().createItem(ladder.getIcon(), GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.LADDER-LEADERBOARD.NAME") + return ItemCreateUtil.createItem(ladder.getIcon(), GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.LADDER-LEADERBOARD.NAME") .replace("%ladder%", ladder.getDisplayName()) .replace("%number%", String.valueOf(showPlayers)) , lore); @@ -302,7 +306,7 @@ public static ItemStack createGlobalWinLb() { .replace("%number%", String.valueOf(i)) .replace("%division%", (division != null ? Common.mmToNormal(division.getFullName()) : "")) .replace("%division_short%", (division != null ? Common.mmToNormal(division.getShortName()) : "")) - .replace("%player%", target.getName()) + .replace("%player%", Objects.requireNonNull(target.getName())) .replace("%global_win%", String.valueOf(stat)) )); } else @@ -319,7 +323,7 @@ public static ItemStack createGlobalWinLb() { } } - return ClassImport.getClasses().getItemCreateUtil().createItem(GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.NAME").replace("%number%", String.valueOf(showPlayers)), Material.valueOf(GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.MATERIAL")), lore); + return ItemCreateUtil.createItem(GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.NAME").replace("%number%", String.valueOf(showPlayers)), Material.valueOf(GUIFile.getString("GUIS.STATISTICS.WIN-LEADERBOARD.ICONS.GLOBAL-LEADERBOARD.MATERIAL")), lore); } public static ItemStack getCacheInfoItem() { @@ -332,9 +336,9 @@ public static ItemStack getCacheInfoItem() { lore.add("&7Next update: &eWithin 5 minutes"); lore.add("&8&m------------------------"); - return ClassImport.getClasses().getItemCreateUtil().createItem( + return ItemCreateUtil.createItem( "&eAuto-Update Info", - ClassImport.getClasses().getItemMaterialUtil().getClock(), + Material.CLOCK, lore ); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/OtherPartiesGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/OtherPartiesGui.java index 460c4a4f3..b94ad567f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/OtherPartiesGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/party/OtherPartiesGui.java @@ -11,10 +11,9 @@ import dev.nandi0813.practice.manager.party.PartyManager; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.module.interfaces.ItemCreateUtil; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -109,7 +108,7 @@ public void handleClickEvent(InventoryClickEvent e) { } public ItemStack getPartyItem(Party party) { - ItemStack itemStack = ClassImport.getClasses().getItemMaterialUtil().getPlayerHead(party.getLeader()); + ItemStack itemStack = ItemCreateUtil.getPlayerHead(party.getLeader()); ItemMeta itemMeta = itemStack.getItemMeta(); List lore = new ArrayList<>(); @@ -133,11 +132,10 @@ public ItemStack getPartyItem(Party party) { lore.add(line); } - itemMeta.setDisplayName(GUIFile.getString("GUIS.PARTY.OTHER-PARTIES.ICONS.PARTY-ITEM.NAME") + itemMeta.displayName(Common.legacyToComponent(GUIFile.getString("GUIS.PARTY.OTHER-PARTIES.ICONS.PARTY-ITEM.NAME") .replace("%leader%", party.getLeader().getName()) - .replace("%partySize%", String.valueOf(party.getMembers().size())) - ); - itemMeta.setLore(lore); + .replace("%partySize%", String.valueOf(party.getMembers().size())))); + itemMeta.lore(lore.stream().map(Common::legacyToComponent).toList()); ItemCreateUtil.hideItemFlags(itemMeta); itemStack.setItemMeta(itemMeta); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileLadderStats.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileLadderStats.java index 74ce4aac7..3189466f5 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileLadderStats.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileLadderStats.java @@ -10,9 +10,9 @@ import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.statistics.LadderStats; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -20,10 +20,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class ProfileLadderStats extends GUI { @@ -36,7 +33,7 @@ public ProfileLadderStats(Profile profile, GUI backTo) { this.profile = profile; this.backTo = backTo; - this.gui.put(1, InventoryUtil.createInventory(GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.TITLE").replace("%player%", profile.getPlayer().getName()), 6)); + this.gui.put(1, InventoryUtil.createInventory(GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.TITLE").replace("%player%", Objects.requireNonNull(profile.getPlayer().getName())), 6)); build(); } @@ -129,12 +126,12 @@ private ItemStack getLadderStatItem(NormalLadder ladder) { } if (ladder.getIcon() != null) - return ClassImport.getClasses().getItemCreateUtil().createItem( + return ItemCreateUtil.createItem( ladder.getIcon(), GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.ICONS.LADDER.UNRANKED-LADDER-STATS.NAME").replace("%ladder%", ladder.getDisplayName()), lore); else - return ClassImport.getClasses().getItemCreateUtil().createItem( + return ItemCreateUtil.createItem( GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.ICONS.LADDER.UNRANKED-LADDER-STATS.NAME").replace("%ladder%", ladder.getDisplayName()), Material.valueOf(GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.ICONS.LADDER.UNRANKED-LADDER-STATS.DEFAULT-MATERIAL")), lore); @@ -153,12 +150,12 @@ private ItemStack getLadderStatItem(NormalLadder ladder) { } if (ladder.getIcon() != null) - return ClassImport.getClasses().getItemCreateUtil().createItem( + return ItemCreateUtil.createItem( ladder.getIcon(), GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.ICONS.LADDER.RANKED-LADDER-STATS.NAME").replace("%ladder%", ladder.getDisplayName()), lore); else - return ClassImport.getClasses().getItemCreateUtil().createItem( + return ItemCreateUtil.createItem( GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.ICONS.LADDER.RANKED-LADDER-STATS.NAME").replace("%ladder%", ladder.getDisplayName()), Material.valueOf(GUIFile.getString("GUIS.PLAYER-INFORMATION.LADDER-STATS.ICONS.LADDER.RANKED-LADDER-STATS.DEFAULT-MATERIAL")), lore); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileSetupGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileSetupGui.java index ba5a14322..6a75daf4e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileSetupGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/profile/ProfileSetupGui.java @@ -9,6 +9,7 @@ import dev.nandi0813.practice.manager.fight.ffa.game.FFA; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.MatchManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.gui.GUI; import dev.nandi0813.practice.manager.gui.GUIItem; import dev.nandi0813.practice.manager.gui.GUIManager; @@ -17,9 +18,9 @@ import dev.nandi0813.practice.manager.profile.RankedBan; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; import dev.nandi0813.practice.manager.spectator.SpectatorManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import dev.nandi0813.practice.util.StringUtil; import dev.nandi0813.practice.util.interfaces.Spectatable; import org.bukkit.Bukkit; @@ -29,6 +30,8 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import java.util.Objects; + public class ProfileSetupGui extends GUI { private final Profile profile; @@ -39,7 +42,7 @@ public ProfileSetupGui(Profile profile) { this.profile = profile; this.profileLadderStats = new ProfileLadderStats(profile, this); - this.gui.put(1, InventoryUtil.createInventory(GUIFile.getString("GUIS.PLAYER-INFORMATION.MAIN-PAGE.TITLE").replace("%player%", profile.getPlayer().getName()), 4)); + this.gui.put(1, InventoryUtil.createInventory(GUIFile.getString("GUIS.PLAYER-INFORMATION.MAIN-PAGE.TITLE").replace("%player%", Objects.requireNonNull(profile.getPlayer().getName())), 4)); build(); } @@ -197,7 +200,7 @@ public void handleClickEvent(InventoryClickEvent e) { } private static ItemStack getBasicInfoItem(Profile profile) { - GUIItem guiItem = new GUIItem(ClassImport.getClasses().getItemMaterialUtil().getPlayerHead(profile.getPlayer())); + GUIItem guiItem = new GUIItem(ItemCreateUtil.getPlayerHead(profile.getPlayer())); guiItem.setName(GUIFile.getString("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.BASIC-INFO.NAME")); guiItem.setLore(GUIFile.getStringList("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.BASIC-INFO.LORE")); @@ -219,36 +222,34 @@ private static ItemStack getOnlineItem(Profile profile) { if (profile.getStatus().equals(ProfileStatus.OFFLINE) || player == null) return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.PLAYER-OFFLINE").get(); - else + else { + player.playerListName(); return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.PLAYER-ONLINE") .replace("%world%", player.getWorld().getName()) .replace("%gamemode%", player.getGameMode().name()) .replace("%flying%", String.valueOf(player.isFlying())) - .replace("%tablist_name%", player.getPlayerListName()) + .replace("%tablist_name%", Common.serializeComponentToLegacyString(player.playerListName())) .replace("%health%", String.valueOf(player.getHealth())) .replace("%food%", String.valueOf(player.getFoodLevel())) .replace("%hit_delay%", String.valueOf(player.getMaximumNoDamageTicks())) - .replace("%ping%", String.valueOf(ClassImport.getClasses().getPlayerUtil().getPing(player))) + .replace("%ping%", String.valueOf(PlayerUtil.getPing(player))) .get(); + } } private static ItemStack getGameItem(Profile profile) { ProfileStatus profileStatus = profile.getStatus(); - switch (profileStatus) { - case OFFLINE: - return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.OFFLINE").get(); - case MATCH: - return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.IN-MATCH").get(); - case FFA: - return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.IN-FFA").get(); - case EVENT: - return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.IN-EVENT").get(); - case SPECTATE: - return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.SPECTATING").get(); - default: - return GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.NOTHING").get(); - } + return switch (profileStatus) { + case OFFLINE -> + GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.OFFLINE").get(); + case MATCH -> GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.IN-MATCH").get(); + case FFA -> GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.IN-FFA").get(); + case EVENT -> GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.IN-EVENT").get(); + case SPECTATE -> + GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.SPECTATING").get(); + default -> GUIFile.getGuiItem("GUIS.PLAYER-INFORMATION.MAIN-PAGE.ICONS.ONLINE-INFO.GAME.NOTHING").get(); + }; } private static ItemStack getPartyItem(Profile profile) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueSelectorGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueSelectorGui.java index 8081c6ebc..eab9b3b45 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueSelectorGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/queue/QueueSelectorGui.java @@ -12,6 +12,7 @@ import dev.nandi0813.practice.manager.ladder.LadderManager; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.queue.QueueManager; +import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -23,11 +24,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitTask; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public abstract class QueueSelectorGui extends GUI { @@ -41,14 +38,6 @@ public abstract class QueueSelectorGui extends GUI { private final Map firstCategoryLadderSlots = new HashMap<>(); private final Map secondCategoryLadderSlots = new HashMap<>(); - /** - * Stores the unresolved template lore for each active ladder slot so the - * real-time ticker can apply fresh %in_queue% / %in_fight% values without - * rebuilding the entire inventory layout. - * - * key = pageId (1 or 2) - * value = map of slot → template ItemStack (with un-replaced placeholders) - */ private final Map> templateItems = new HashMap<>(); private long lastUpdateTime = -1L; @@ -182,21 +171,23 @@ private void tickUpdate() { // Replace dynamic placeholders in display name if (meta.hasDisplayName()) { - meta.setDisplayName(meta.getDisplayName() + String replaced = Common.serializeComponentToLegacyString(meta.displayName()) .replace("%in_queue%", String.valueOf(inQueue)) - .replace("%in_fight%", String.valueOf(inFight))); + .replace("%in_fight%", String.valueOf(inFight)); + meta.displayName(Common.legacyToComponent(replaced)); } // Replace dynamic placeholders in lore - List lore = meta.getLore(); + List lore = meta.lore(); if (lore != null) { List newLore = new ArrayList<>(); - for (String line : lore) { + for (net.kyori.adventure.text.Component lineComponent : lore) { + String line = Common.serializeComponentToLegacyString(lineComponent); newLore.add(line .replace("%in_queue%", String.valueOf(inQueue)) .replace("%in_fight%", String.valueOf(inFight))); } - meta.setLore(newLore); + meta.lore(newLore.stream().map(Common::legacyToComponent).toList()); } updated.setItemMeta(meta); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/ArenaSelectorGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/ArenaSelectorGui.java index b9991369a..9b8a7c293 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/ArenaSelectorGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/ArenaSelectorGui.java @@ -17,9 +17,9 @@ import dev.nandi0813.practice.manager.party.Party; import dev.nandi0813.practice.manager.party.PartyManager; import dev.nandi0813.practice.manager.party.matchrequest.PartyRequest; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; @@ -71,7 +71,7 @@ public void update() { for (String line : GUIFile.getStringList("GUIS.SELECTORS.ARENA-SELECTOR.ICONS.ARENA-ICON.LORE")) lore.add(line.replace("%arena%", arena.getDisplayName())); - ItemStack icon = ClassImport.getClasses().getItemCreateUtil().createItem(arena.getIcon(), GUIFile.getString("GUIS.SELECTORS.ARENA-SELECTOR.ICONS.ARENA-ICON.NAME").replace("%arena%", arena.getDisplayName()), lore); + ItemStack icon = ItemCreateUtil.createItem(arena.getIcon(), GUIFile.getString("GUIS.SELECTORS.ARENA-SELECTOR.ICONS.ARENA-ICON.NAME").replace("%arena%", arena.getDisplayName()), lore); int slot = inventory.firstEmpty(); inventory.setItem(slot, icon); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/LadderSelectorGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/LadderSelectorGui.java index 9e340580c..4c18159a7 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/LadderSelectorGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/guis/selectors/LadderSelectorGui.java @@ -24,9 +24,9 @@ import dev.nandi0813.practice.manager.party.PartyManager; import dev.nandi0813.practice.manager.party.matchrequest.PartyRequest; import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.ItemCreateUtil; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; @@ -81,7 +81,7 @@ public void update() { for (String line : GUIFile.getStringList("GUIS.SELECTORS.LADDER-SELECTOR.ICONS.LADDER.LORE")) lore.add(line.replace("%ladder%", ladder.getDisplayName())); - ItemStack icon = ClassImport.getClasses().getItemCreateUtil().createItem(ladder.getIcon(), GUIFile.getString("GUIS.SELECTORS.LADDER-SELECTOR.ICONS.LADDER.NAME").replace("%ladder%", ladder.getDisplayName()), lore); + ItemStack icon = ItemCreateUtil.createItem(ladder.getIcon(), GUIFile.getString("GUIS.SELECTORS.LADDER-SELECTOR.ICONS.LADDER.NAME").replace("%ladder%", ladder.getDisplayName()), lore); int slot = inventory.firstEmpty(); gui.get(1).setItem(slot, icon); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSetupUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSetupUtil.java index 2ea42f969..810e772fe 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSetupUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSetupUtil.java @@ -6,8 +6,8 @@ import dev.nandi0813.practice.manager.backend.GUIFile; import dev.nandi0813.practice.manager.gui.GUIItem; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.ItemCreateUtil; import lombok.Getter; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -35,14 +35,14 @@ public static ItemStack getNameItem(Arena arena) { } if (arena.getIcon() != null) { - return ClassImport.getClasses().getItemCreateUtil().createItem( + return ItemCreateUtil.createItem( arena.getIcon(), GUIFile.getString("GUIS.SETUP.ARENA.ARENA-MAIN.ICONS.ARENA-NAME.NAME") .replace("%arenaDisplayName%", arena.getDisplayName()) .replace("%arenaName%", arena.getName()), lore); } else { - return ClassImport.getClasses().getItemCreateUtil().createItem( + return ItemCreateUtil.createItem( GUIFile.getString("GUIS.SETUP.ARENA.ARENA-MAIN.ICONS.ARENA-NAME.NAME") .replace("%arenaDisplayName%", arena.getDisplayName()) .replace("%arenaName%", arena.getName()), diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSummaryGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSummaryGui.java index b9a7345bb..67524578a 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSummaryGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/ArenaSummaryGui.java @@ -10,6 +10,7 @@ import dev.nandi0813.practice.manager.gui.GUIItem; import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; +import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; import dev.nandi0813.practice.util.PageUtil; import lombok.Getter; @@ -180,7 +181,7 @@ private static ItemStack getArenaItem(DisplayArena arena) { if (arena.getIcon() != null) { guiItem.setMaterial(arena.getIcon().getType()); - guiItem.setDamage(arena.getIcon().getDurability()); + guiItem.setDamage(Common.getItemDamage(arena.getIcon())); } guiItem @@ -199,7 +200,7 @@ private static ItemStack getArenaItem(Arena arena) { if (arena.getIcon() != null) { guiItem.setMaterial(arena.getIcon().getType()); - guiItem.setDamage(arena.getIcon().getDurability()); + guiItem.setDamage(Common.getItemDamage(arena.getIcon())); } guiItem diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/ffa/ArenaMainGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/ffa/ArenaMainGui.java index ab1712474..69c6a976c 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/ffa/ArenaMainGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/ffa/ArenaMainGui.java @@ -72,8 +72,8 @@ public void update() { .replace("%arenaDisplayName%", ffaArena.getDisplayName()) .replace("%arenaName%", ffaArena.getName()) .replace("%arenaType%", ffaArena.getType().toString()) - .setMaterial(ffaArena.getIcon() != null && ffaArena.getIcon().getType() != null ? ffaArena.getIcon().getType() : null) - .setDamage(ffaArena.getIcon() != null && ffaArena.getIcon().getDurability() != 0 ? ffaArena.getIcon().getDurability() : -1) + .setMaterial(ffaArena.getIcon() != null ? ffaArena.getIcon().getType() : null) + .setDamage(ffaArena.getIcon() != null && Common.getItemDamage(ffaArena.getIcon()) != 0 ? Common.getItemDamage(ffaArena.getIcon()) : -1) .get()); inventory.setItem(11, ffaArena.isEnabled() ? STATUS_ENABLED_ITEM : STATUS_DISABLED_ITEM); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/normal/CopyGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/normal/CopyGui.java index c62018fbe..b45363dce 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/normal/CopyGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/arena/arenasettings/normal/CopyGui.java @@ -14,7 +14,6 @@ import dev.nandi0813.practice.manager.gui.setup.arena.ArenaSetupUtil; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; import dev.nandi0813.practice.util.PageUtil; @@ -164,7 +163,7 @@ public void handleClickEvent(InventoryClickEvent e) { return; } - Location location = ClassImport.getClasses().getArenaCopyUtil().createCopy(profile, arena); + Location location = ZonePractice.getArenaCopyUtilListener().createCopy(profile, arena); if (!ConfigManager.getBoolean("ARENA.TELEPORT-TO-COPY")) return; player.teleport(location); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/event/EventSetupUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/event/EventSetupUtil.java index 8481dda98..2c2d5b686 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/event/EventSetupUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/event/EventSetupUtil.java @@ -2,29 +2,11 @@ import dev.nandi0813.practice.manager.backend.GUIFile; import dev.nandi0813.practice.manager.fight.event.interfaces.EventData; -import dev.nandi0813.practice.module.util.ClassImport; -import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; -import java.util.List; - public enum EventSetupUtil { ; - // Marker item - public static ItemStack getMarkerItem(EventData eventData) { - List lore = new ArrayList<>(); - lore.add(""); - lore.add("&eEvent: &b" + eventData.getType().getName()); - lore.add(""); - lore.add("&e&lLEFT-CLICK &7marks the first corner."); - lore.add("&6&lRIGHT-CLICK &7marks the second corner."); - lore.add(""); - lore.add("&c&lNote: &7This can't be undone."); - return ClassImport.getClasses().getItemCreateUtil().createItem("&bCorner Marker", Material.STICK, lore); - } - public static ItemStack getBroadcastIntervalItem(final int broadcastInterval) { return GUIFile.getGuiItem("GUIS.SETUP.EVENT.EVENT-SETTINGS.ICONS.BROADCAST-INTERVAL").replace("%broadcastInterval%", String.valueOf(broadcastInterval)).get(); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/DestroyableBlocksGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/DestroyableBlocksGui.java index 2b554117d..10b049a28 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/DestroyableBlocksGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/DestroyableBlocksGui.java @@ -11,7 +11,9 @@ import dev.nandi0813.practice.util.BasicItem; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; +import dev.nandi0813.practice.util.StringUtil; import lombok.Getter; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -21,6 +23,7 @@ import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import java.util.List; @@ -68,7 +71,13 @@ public void update() { for (int i = 0; i <= INVENTORY_LAST_SLOT; i++) { if (i == BACK_SLOT) continue; if (inventory.getItem(i) == null) { - inventory.setItem(i, new ItemStack(block.getMaterial(), 1, block.getDamage())); + ItemStack blockItem = new ItemStack(block.getMaterial(), 1); + ItemMeta blockMeta = blockItem.getItemMeta(); + if (blockMeta instanceof Damageable damageable) { + damageable.setDamage(block.getDamage()); + blockItem.setItemMeta(damageable); + } + inventory.setItem(i, blockItem); break; } } @@ -131,7 +140,7 @@ public void save() { if (i == BACK_SLOT) continue; ItemStack itemStack = this.gui.get(1).getItem(i); if (itemStack != null && !itemStack.getType().equals(Material.AIR)) { - BasicItem block = new BasicItem(itemStack.getType(), itemStack.getDurability()); + BasicItem block = new BasicItem(itemStack.getType(), Common.getItemDamage(itemStack)); basicItems.add(block); } } @@ -168,8 +177,8 @@ private void checkItem(InventoryClickEvent e) { itemStack.setAmount(1); if (itemStack.hasItemMeta()) { ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setDisplayName(itemStack.getType().getData().getSimpleName()); - itemMeta.setLore(null); + itemMeta.displayName(Component.text(StringUtil.getNormalizedName(itemStack.getType().name()))); + itemMeta.lore(null); itemMeta.getItemFlags().clear(); itemStack.setItemMeta(itemMeta); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/InventoryGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/InventoryGui.java index 2739b9d63..bee11fe0e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/InventoryGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/ladder/laddersettings/InventoryGui.java @@ -10,12 +10,7 @@ import dev.nandi0813.practice.manager.gui.setup.ladder.LadderSetupManager; import dev.nandi0813.practice.manager.ladder.LadderManager; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; -import dev.nandi0813.practice.module.interfaces.KitData; -import dev.nandi0813.practice.module.util.VersionChecker; -import dev.nandi0813.practice.util.ArmorUtil; -import dev.nandi0813.practice.util.Common; -import dev.nandi0813.practice.util.InventoryUtil; -import dev.nandi0813.practice.util.StringUtil; +import dev.nandi0813.practice.util.*; import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; @@ -29,14 +24,13 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; public class InventoryGui extends GUI { - private static final boolean secondHand = Optional.ofNullable(VersionChecker.getBukkitVersion()) - .map(VersionChecker.BukkitVersion::isSecondHand) - .orElse(false); - @Getter private final NormalLadder ladder; private final KitData kitData; @@ -90,11 +84,8 @@ public void update() { inventory.setItem(i, armorContent.get(i - 50)); } - if (secondHand) { - if (kitData.getExtra() != null) - inventory.setItem(49, kitData.getExtra()[0]); - } else - inventory.setItem(49, GUIManager.getFILLER_ITEM()); + if (kitData.getExtra() != null) + inventory.setItem(49, kitData.getExtra()[0]); } updatePlayers(); @@ -153,11 +144,9 @@ public void save() { for (int i = 0; i < 27; i++) inventoryContent.add(inventory.getItem(i)); for (int i = 50; i < 54; i++) armorContent.add(inventory.getItem(i)); - if (secondHand) { - List extraContent = new ArrayList<>(); - extraContent.add(inventory.getItem(49)); - kitData.setExtra(extraContent.toArray(new ItemStack[0])); - } + List extraContent = new ArrayList<>(); + extraContent.add(inventory.getItem(49)); + kitData.setExtra(extraContent.toArray(new ItemStack[0])); kitData.setStorage(inventoryContent.toArray(new ItemStack[0])); kitData.setArmor(armorContent.toArray(new ItemStack[0])); @@ -178,7 +167,7 @@ private ItemStack getEffectItem(List effects) { List effectStrings = new ArrayList<>(); for (PotionEffect potionEffect : effects) effectStrings.add(GUIFile.getString("GUIS.SETUP.LADDER.INVENTORY.ICONS.EFFECTS.HAS-EFFECT.EFFECT-FORMAT") - .replace("%name%", StringUtils.capitalize(potionEffect.getType().getName().replace("_", " ").toLowerCase())) + .replace("%name%", StringUtils.capitalize(potionEffect.getType().getKey().getKey().replace("_", " ").toLowerCase())) .replace("%amplifier%", String.valueOf(potionEffect.getAmplifier() + 1)) .replace("%time%", StringUtil.formatMillisecondsToMinutes((potionEffect.getDuration() / 20) * 1000L)) ); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/server/ServerMatchesGui.java b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/server/ServerMatchesGui.java index 17cc28517..f29ac477f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/server/ServerMatchesGui.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/gui/setup/server/ServerMatchesGui.java @@ -174,7 +174,7 @@ private ItemStack getMatchItem(Match match) { GUIItem guiItem = new GUIItem( GUIFile.getString("GUIS.SETUP.SERVER.MATCHES.ICONS.MATCH-ICON.NAME"), match.getLadder().getIcon().getType(), - match.getLadder().getIcon().getDurability(), + Common.getItemDamage(match.getLadder().getIcon()), GUIFile.getStringList("GUIS.SETUP.SERVER.MATCHES.ICONS.MATCH-ICON.LORE") ); guiItem diff --git a/core/src/main/java/dev/nandi0813/practice/manager/inventory/Inventory.java b/core/src/main/java/dev/nandi0813/practice/manager/inventory/Inventory.java index e37948c64..61e84b10b 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/inventory/Inventory.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/inventory/Inventory.java @@ -1,9 +1,10 @@ package dev.nandi0813.practice.manager.inventory; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.inventory.inventoryitem.ExtraInvItem; import dev.nandi0813.practice.manager.inventory.inventoryitem.InvArmor; import dev.nandi0813.practice.manager.inventory.inventoryitem.InvItem; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.util.Common; import lombok.Getter; import org.bukkit.Material; import org.bukkit.configuration.file.YamlConfiguration; @@ -11,6 +12,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Getter public abstract class Inventory { @@ -54,7 +56,7 @@ public void setInventory(Player player) { if (currentInventory != null) currentInventory.getPlayers().remove(player); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + PlayerUtil.clearInventory(player); players.add(player); @@ -85,7 +87,7 @@ private void getExtraItems() { YamlConfiguration config = InventoryManager.getInstance().getConfig(); if (config.isConfigurationSection(type.getPath() + ".EXTRA")) { - for (String itemPath : config.getConfigurationSection(type.getPath() + ".EXTRA").getKeys(false)) { + for (String itemPath : Objects.requireNonNull(config.getConfigurationSection(type.getPath() + ".EXTRA")).getKeys(false)) { ExtraInvItem extraInvItem = new ExtraInvItem(type.getPath() + ".EXTRA." + itemPath); invItems.add(extraInvItem); @@ -103,15 +105,15 @@ protected InvItem getInvItem(final int slot, final Material material) { protected InvItem getInvItem(final String name, final Material material) { return invItems.stream().filter(invItem -> - invItem.getItem().getItemMeta().getDisplayName().equalsIgnoreCase(name) && + Common.getItemDisplayName(invItem.getItem()).equalsIgnoreCase(name) && invItem.getItem().getType().equals(material) && invItem.getSlot() != -1 ).findFirst().orElse(null); } - protected InvItem getInvItem(Class c) { + protected InvItem getInvItem() { return invItems.stream().filter(invItem -> - invItem.getClass().equals(c) && + invItem.getClass().equals(dev.nandi0813.practice.manager.inventory.inventoryitem.lobbyitems.RematchInvItem.class) && invItem.getSlot() != -1 ).findFirst().orElse(null); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryListener.java b/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryListener.java index 2236bc630..65ec561af 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryListener.java @@ -1,6 +1,7 @@ package dev.nandi0813.practice.manager.inventory; import dev.nandi0813.practice.manager.backend.ConfigManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.inventory.inventories.StaffInventory; import dev.nandi0813.practice.manager.inventory.inventoryitem.InvItem; import dev.nandi0813.practice.manager.inventory.inventoryitem.staffitems.CheckInventoryInvItem; @@ -9,7 +10,6 @@ import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; import dev.nandi0813.practice.manager.server.ServerManager; import dev.nandi0813.practice.manager.server.WorldEnum; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -18,13 +18,15 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; import org.bukkit.inventory.ItemStack; public class InventoryListener implements Listener { @@ -58,15 +60,16 @@ public void onPlayerInteractWithInvItem(PlayerInteractEvent e) { } InvItem invItem; + String itemDisplayName = Common.getItemDisplayName(item); if (ServerManager.getInstance().getInWorld().get(player).equals(WorldEnum.LOBBY) && !player.hasPermission("zpp.admin")) { - invItem = inventory.getHoldItem(item.getItemMeta().getDisplayName(), item.getType(), e.getPlayer().getInventory().getHeldItemSlot()); + invItem = inventory.getHoldItem(itemDisplayName, item.getType(), e.getPlayer().getInventory().getHeldItemSlot()); } else { int slot = -1; if (profile.getStatus().equals(ProfileStatus.QUEUE)) { slot = e.getPlayer().getInventory().getHeldItemSlot(); } - invItem = inventory.getHoldItem(item.getItemMeta().getDisplayName(), item.getType(), slot); + invItem = inventory.getHoldItem(itemDisplayName, item.getType(), slot); } if (invItem != null) { @@ -97,21 +100,40 @@ public void onPlayerInteractWithEntity(PlayerInteractEntityEvent e) { if (inventory == null) return; if (inventory instanceof StaffInventory) { - ItemStack itemInHand = ClassImport.getClasses().getPlayerUtil().getPlayerMainHand(player); - InvItem invItem = inventory.getInvItem(itemInHand.getItemMeta().getDisplayName(), itemInHand.getType()); + ItemStack itemInHand = PlayerUtil.getPlayerMainHand(player); + InvItem invItem = inventory.getInvItem(Common.getItemDisplayName(itemInHand), itemInHand.getType()); if (invItem instanceof CheckInventoryInvItem checkInventoryInvItem) { checkInventoryInvItem.handleClickEvent(player, target); } } - return; } + } + + // Sword-to-duel: when in lobby, hitting a player with the unranked sword sends a duel request + // Only triggers when the player is holding the unranked item + @EventHandler + public void onPlayerAttackEntity(EntityDamageByEntityEvent e) { + if (!(e.getDamager() instanceof Player player)) return; + if (!(e.getEntity() instanceof Player target)) return; - // Right-click-to-duel: when in lobby, right-clicking a player sends a duel request - if (ConfigManager.getBoolean("MATCH-SETTINGS.DUEL.RIGHT-CLICK-TO-DUEL") + Profile profile = ProfileManager.getInstance().getProfile(player); + + if (ConfigManager.getBoolean("MATCH-SETTINGS.DUEL.SWORD-TO-DUEL") && profile.getStatus().equals(ProfileStatus.LOBBY) && !profile.isParty() && player.hasPermission("zpp.duel")) { + + Inventory inventory = InventoryManager.getInstance().getPlayerInventory(player); + if (inventory == null) return; + ItemStack itemInHand = PlayerUtil.getPlayerMainHand(player); + if (itemInHand.getType() == Material.AIR || !itemInHand.hasItemMeta()) return; + + InvItem heldInvItem = inventory.getInvItem(Common.getItemDisplayName(itemInHand), itemInHand.getType()); + if (!(heldInvItem instanceof dev.nandi0813.practice.manager.inventory.inventoryitem.lobbyitems.UnrankedInvItem)) + return; + + e.setCancelled(true); player.performCommand("duel " + target.getName()); } } @@ -175,8 +197,9 @@ public void onPlayerDropItem(PlayerDropItemEvent e) { } @EventHandler - public void onPlayerPickupItem(PlayerPickupItemEvent e) { - Player player = e.getPlayer(); + public void onPlayerPickupItem(EntityPickupItemEvent e) { + if (!(e.getEntity() instanceof Player player)) return; + Profile profile = ProfileManager.getInstance().getProfile(player); ProfileStatus profileStatus = profile.getStatus(); @@ -236,4 +259,18 @@ public void onEntityDamage(EntityDamageEvent e) { } } + @EventHandler + public void onItemSwitchHand(PlayerSwapHandItemsEvent e) { + Player player = e.getPlayer(); + if (player.isOp() || player.hasPermission("*")) return; + + Profile profile = ProfileManager.getInstance().getProfile(player); + + if (profile == null) return; + + switch (profile.getStatus()) { + case LOBBY, QUEUE, EDITOR, SPECTATE -> e.setCancelled(true); + } + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryManager.java b/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryManager.java index 902759436..8ced0f505 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryManager.java @@ -13,7 +13,6 @@ import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; import dev.nandi0813.practice.manager.server.ServerManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.ItemSerializationUtil; import dev.nandi0813.practice.util.playerutil.PlayerUtil; import lombok.Getter; @@ -76,7 +75,7 @@ public void setInventory(Player player, Inventory.InventoryType inventoryType) { if (playerInv != null) { playerInv.getPlayers().remove(player); } - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); return; } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryUtil.java index 4b9534bd1..962c0c86e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/inventory/InventoryUtil.java @@ -2,12 +2,12 @@ import dev.nandi0813.api.Utilities.PlayerNametag; import dev.nandi0813.practice.manager.backend.ConfigManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.nametag.NametagManager; import dev.nandi0813.practice.manager.nametag.TabIntegration; import dev.nandi0813.practice.manager.nametag.TeamPacketBlocker; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.group.Group; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.PermanentConfig; import net.kyori.adventure.text.Component; @@ -42,7 +42,7 @@ public static void setLobbyNametag(Player player, Profile profile) { if (tabIntegration != null && tabIntegration.isAvailable()) { tabIntegration.setTabListName(player, listName); } else { - ClassImport.getClasses().getPlayerUtil().setPlayerListName(player, listName); + PlayerUtil.setPlayerListName(player, listName); } // ── Nametag management (above-head prefix / suffix / color) ── diff --git a/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/EventQueueInventory.java b/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/EventQueueInventory.java index 4b75ead70..b11618823 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/EventQueueInventory.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/EventQueueInventory.java @@ -5,6 +5,7 @@ import dev.nandi0813.practice.manager.inventory.Inventory; import dev.nandi0813.practice.manager.inventory.inventoryitem.InvItem; import dev.nandi0813.practice.manager.inventory.inventoryitem.queueitems.EventQueueLeaveInvItem; +import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.StringUtil; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -35,7 +36,8 @@ protected void set(Player player) { ItemStack item = invItem.getItem().clone(); ItemMeta itemMeta = item.getItemMeta(); - itemMeta.setDisplayName(StringUtil.CC(itemMeta.getDisplayName().replace("%event%", event.getType().getName()))); + String displayName = Common.serializeComponentToLegacyString(itemMeta.displayName()); + itemMeta.displayName(Common.legacyToComponent(StringUtil.CC(displayName.replace("%event%", event.getType().getName())))); item.setItemMeta(itemMeta); playerInventory.setItem(slot, item); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/LobbyInventory.java b/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/LobbyInventory.java index 500a3cbf0..16b214abc 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/LobbyInventory.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/inventory/inventories/LobbyInventory.java @@ -4,7 +4,9 @@ import dev.nandi0813.practice.manager.inventory.InventoryManager; import dev.nandi0813.practice.manager.inventory.inventoryitem.InvItem; import dev.nandi0813.practice.manager.inventory.inventoryitem.lobbyitems.*; +import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; public class LobbyInventory extends Inventory { @@ -35,20 +37,27 @@ protected void set(Player player) { if (slot == -1) continue; - if (invItem instanceof SpectateModeInvItem) { - if (!InventoryManager.SPECTATOR_MODE_ENABLED) + switch (invItem) { + case SpectateModeInvItem spectateModeInvItem -> { + if (!InventoryManager.SPECTATOR_MODE_ENABLED) + continue; + } + case SetupInvItem setupInvItem -> { + if (!player.hasPermission("zpp.setup")) + continue; + setupItemSet = true; + } + case StaffMode staffMode -> { + if (!player.hasPermission("zpp.staffmode")) + continue; + if (setupItemSet) + continue; + } + case RematchInvItem rematchInvItem -> { continue; - } else if (invItem instanceof SetupInvItem) { - if (!player.hasPermission("zpp.setup")) - continue; - setupItemSet = true; - } else if (invItem instanceof StaffMode) { - if (!player.hasPermission("zpp.staffmode")) - continue; - if (setupItemSet) - continue; - } else if (invItem instanceof RematchInvItem) { - continue; + } + default -> { + } } playerInventory.setItem(slot, invItem.getItem()); @@ -56,10 +65,31 @@ protected void set(Player player) { } public void addRematchItem(Player player) { - InvItem invItem = this.getInvItem(RematchInvItem.class); + InvItem invItem = getRematchInvItem(); if (invItem == null) return; player.getInventory().setItem(invItem.getSlot(), invItem.getItem()); } + public void removeRematchItem(Player player) { + InvItem invItem = getRematchInvItem(); + if (invItem == null) return; + + int slot = invItem.getSlot(); + if (slot < 0) return; + + ItemStack current = player.getInventory().getItem(slot); + if (current == null || current.getType() == Material.AIR) return; + + // Only clear the slot if the current item is still the rematch item. + if (current.isSimilar(invItem.getItem())) { + player.getInventory().setItem(slot, null); + player.updateInventory(); + } + } + + private InvItem getRematchInvItem() { + return this.getInvItem(); + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/Ladder.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/Ladder.java index 681393020..2cb12a13b 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/Ladder.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/Ladder.java @@ -5,8 +5,8 @@ import dev.nandi0813.practice.manager.fight.match.enums.MatchType; import dev.nandi0813.practice.manager.ladder.enums.LadderType; import dev.nandi0813.practice.manager.ladder.util.LadderKnockback; -import dev.nandi0813.practice.module.interfaces.KitData; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.KitData; import dev.nandi0813.practice.util.StringUtil; import lombok.Getter; import lombok.Setter; @@ -75,7 +75,7 @@ protected Ladder(String name, LadderType type) { this.name = name; this.displayName = name; this.type = type; - this.kitData = ClassImport.createKitData(); + this.kitData = new KitData(); this.ladderKnockback = new LadderKnockback(); } @@ -85,7 +85,7 @@ protected Ladder(Ladder ladder) { if (ladder.getIcon() != null) { this.icon = ladder.getIcon().clone(); } - this.kitData = ClassImport.createKitData(ladder.getKitData()); + this.kitData = new KitData(ladder.getKitData()); this.type = ladder.getType(); this.enabled = ladder.isEnabled(); this.ladderKnockback = new LadderKnockback(ladder.getLadderKnockback()); @@ -126,8 +126,9 @@ public void setIcon(final ItemStack icon) { this.icon = icon.clone(); - if (icon.hasItemMeta() && icon.getItemMeta().getDisplayName() != null && !icon.getItemMeta().getDisplayName().equalsIgnoreCase(" ")) - this.displayName = StringUtil.CC(icon.getItemMeta().getDisplayName()); + String iconDisplayName = Common.getItemDisplayName(icon); + if (!iconDisplayName.isBlank()) + this.displayName = StringUtil.CC(iconDisplayName); else this.displayName = name; } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/interfaces/TempBuild.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/interfaces/TempBuild.java index 86b9ca7b2..420dd49e2 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/interfaces/TempBuild.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/interfaces/TempBuild.java @@ -1,10 +1,10 @@ package dev.nandi0813.practice.manager.ladder.abstraction.interfaces; -import dev.nandi0813.practice.ZonePractice; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.util.BlockUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.fight.util.ListenerUtil; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.fightmapchange.BlockPosition; import dev.nandi0813.practice.util.fightmapchange.FightChangeOptimized; import org.bukkit.Location; @@ -14,8 +14,6 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; import org.jetbrains.annotations.NotNull; import static dev.nandi0813.practice.util.PermanentConfig.PLACED_IN_FIGHT; @@ -32,19 +30,19 @@ static void onBucketEmpty(final @NotNull PlayerBucketEmptyEvent e, final @NotNul Player player = e.getPlayer(); Block block = e.getBlockClicked(); - block.getRelative(e.getBlockFace()).setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), match)); + BlockUtil.setMetadata(block.getRelative(e.getBlockFace()), PLACED_IN_FIGHT, match); for (BlockFace face : BlockFace.values()) { Block relative = block.getRelative(face, 1); - if (relative.hasMetadata(PLACED_IN_FIGHT)) { - MetadataValue mv = BlockUtil.getMetadata(relative, PLACED_IN_FIGHT); + if (BlockUtil.hasMetadata(relative, PLACED_IN_FIGHT)) { + Object mv = BlockUtil.getMetadata(relative, PLACED_IN_FIGHT, Object.class); if (ListenerUtil.checkMetaData(mv) || relative.getType().isSolid()) continue; - match.getFightChange().addBlockChange(ClassImport.createChangeBlock(block), player, buildDelay); + match.getFightChange().addBlockChange(new ChangedBlock(block), player, buildDelay); Block b2 = block.getLocation().subtract(0, 1, 0).getBlock(); - if (ClassImport.getClasses().getArenaUtil().turnsToDirt(b2)) - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(b2)); + if (ArenaUtil.turnsToDirt(b2)) + match.getFightChange().addArenaBlockChange(new ChangedBlock(b2)); } } } @@ -55,13 +53,13 @@ static void onBlockPlace(final @NotNull BlockPlaceEvent e, final @NotNull Match Player player = e.getPlayer(); Block block = e.getBlockPlaced(); - block.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), match)); + BlockUtil.setMetadata(block, PLACED_IN_FIGHT, match); - match.getFightChange().addBlockChange(ClassImport.createChangeBlock(e), player, buildDelay); + match.getFightChange().addBlockChange(new ChangedBlock(e), player, buildDelay); Block block2 = e.getBlockPlaced().getLocation().subtract(0, 1, 0).getBlock(); - if (ClassImport.getClasses().getArenaUtil().turnsToDirt(block2)) - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(block2)); + if (ArenaUtil.turnsToDirt(block2)) + match.getFightChange().addArenaBlockChange(new ChangedBlock(block2)); } static void onBlockBreak(final @NotNull BlockBreakEvent e, final @NotNull Match match) { @@ -71,9 +69,9 @@ static void onBlockBreak(final @NotNull BlockBreakEvent e, final @NotNull Match Location location = block.getLocation(); FightChangeOptimized fightChange = match.getFightChange(); - if (!block.hasMetadata(PLACED_IN_FIGHT)) return; + if (!BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) return; - MetadataValue mv = BlockUtil.getMetadata(e.getBlock(), PLACED_IN_FIGHT); + Object mv = BlockUtil.getMetadata(e.getBlock(), PLACED_IN_FIGHT, Object.class); if (ListenerUtil.checkMetaData(mv)) { e.setCancelled(true); return; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/BedFight.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/BedFight.java index f8f4b5ce3..8995da829 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/BedFight.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/BedFight.java @@ -7,13 +7,13 @@ import dev.nandi0813.practice.manager.fight.match.enums.TeamEnum; import dev.nandi0813.practice.manager.fight.match.interfaces.Team; import dev.nandi0813.practice.manager.fight.match.util.TempKillPlayer; +import dev.nandi0813.practice.manager.fight.util.BedUtil; import dev.nandi0813.practice.manager.fight.util.DeathCause; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.DeathResult; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.RespawnableLadder; import dev.nandi0813.practice.manager.ladder.enums.LadderType; import dev.nandi0813.practice.manager.server.sound.SoundManager; import dev.nandi0813.practice.manager.server.sound.SoundType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Cuboid; import lombok.Getter; import lombok.Setter; @@ -77,7 +77,7 @@ protected static void onPlayerMove(final @NotNull PlayerMoveEvent e, final @NotN } protected static void onBedDestroy(final @NotNull BlockBreakEvent e, final @NotNull Match match) { - if (ClassImport.getClasses().getBedUtil().onBedBreak(e, match)) { + if (BedUtil.onBedBreak(e, match)) { SoundManager.getInstance().getSound(SoundType.BED_BREAK).play(match.getPlayers()); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/NormalLadder.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/NormalLadder.java index ca9884983..5969c6ad0 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/NormalLadder.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/NormalLadder.java @@ -76,7 +76,7 @@ public void deleteData() { } public boolean isReadyToEnable() { - return icon != null && kitData.isSet() && !matchTypes.isEmpty(); + return icon != null && kitData.isSet(); } public void setFrozen(boolean frozen) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/PortalFight.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/PortalFight.java index 7fc409204..012a7fdc1 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/PortalFight.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/abstraction/normal/PortalFight.java @@ -1,7 +1,7 @@ package dev.nandi0813.practice.manager.ladder.abstraction.normal; -import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.arenas.interfaces.NormalArena; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; import dev.nandi0813.practice.manager.arena.util.PortalLocation; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.Round; @@ -11,9 +11,9 @@ import dev.nandi0813.practice.manager.fight.match.interfaces.Team; import dev.nandi0813.practice.manager.fight.match.type.playersvsplayers.PlayersVsPlayersRound; import dev.nandi0813.practice.manager.fight.util.BlockUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.fight.util.DeathCause; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -22,8 +22,6 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; import org.jetbrains.annotations.NotNull; import static dev.nandi0813.practice.util.PermanentConfig.PLACED_IN_FIGHT; @@ -88,12 +86,12 @@ protected static void onBlockPlace(final @NotNull BlockPlaceEvent e, final @NotN } if (!e.isCancelled()) { - e.getBlockPlaced().setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), match)); - match.addBlockChange(ClassImport.createChangeBlock(e)); + BlockUtil.setMetadata(e.getBlockPlaced(), PLACED_IN_FIGHT, match); + match.addBlockChange(new ChangedBlock(e)); Block underBlock = e.getBlockPlaced().getLocation().subtract(0, 1, 0).getBlock(); - if (ClassImport.getClasses().getArenaUtil().turnsToDirt(underBlock)) - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(underBlock)); + if (ArenaUtil.turnsToDirt(underBlock)) + match.getFightChange().addArenaBlockChange(new ChangedBlock(underBlock)); } } @@ -111,26 +109,21 @@ protected static void onBlockBreak(final @NotNull BlockBreakEvent e, final @NotN // whether the actual break is permitted. addBlockChange would tag the block with // PLACED_IN_FIGHT, causing LadderTypeListener to treat it as a player-placed block // and allow the break even when breakAllBlocks is disabled. - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(e.getBlock())); + match.getFightChange().addArenaBlockChange(new ChangedBlock(e.getBlock())); Block underBlock = e.getBlock().getLocation().subtract(0, 1, 0).getBlock(); if (underBlock.getType() == Material.DIRT) { - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(underBlock)); + match.getFightChange().addArenaBlockChange(new ChangedBlock(underBlock)); } } } protected static void onLiquidFlow(final @NotNull BlockFromToEvent e) { Block block = e.getBlock(); - if (!block.hasMetadata(PLACED_IN_FIGHT)) return; + if (!BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) return; - MetadataValue mv = BlockUtil.getMetadata(block, PLACED_IN_FIGHT); - if (mv == null) return; - if (mv.value() == null) return; - - // Check for Match specifically (portal fights are only in matches) - if (!(mv.value() instanceof Match)) return; - Match match = (Match) mv.value(); + Match match = BlockUtil.getMetadata(block, PLACED_IN_FIGHT, Match.class); + if (match == null) return; NormalArena arena = match.getArena(); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/enums/LadderType.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/enums/LadderType.java index 3634c5e05..1a1dd7226 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/enums/LadderType.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/enums/LadderType.java @@ -3,7 +3,6 @@ import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.gui.setup.ladder.laddersettings.Settings.SettingType; import dev.nandi0813.practice.manager.ladder.type.*; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import lombok.Getter; import org.bukkit.Material; @@ -84,7 +83,7 @@ public enum LadderType { SPLEEF(LadderTypeConfig.builder( "LADDER.LADDER-TYPES.SPLEEF.NAME", - ClassImport.getClasses().getItemMaterialUtil().getIronShovel(), + Material.IRON_SHOVEL, "LADDER.LADDER-TYPES.SPLEEF.DESCRIPTION", Spleef.class ) @@ -106,7 +105,7 @@ public enum LadderType { SKYWARS(LadderTypeConfig.builder( "LADDER.LADDER-TYPES.SKYWARS.NAME", - ClassImport.getClasses().getItemMaterialUtil().getEyeOfEnder(), + Material.ENDER_EYE, "LADDER.LADDER-TYPES.SKYWARS.DESCRIPTION", SkyWars.class ) @@ -120,7 +119,7 @@ public enum LadderType { BEDWARS(LadderTypeConfig.builder( "LADDER.LADDER-TYPES.BEDWARS.NAME", - ClassImport.getClasses().getItemMaterialUtil().getRedBed(), + Material.RED_BED, "LADDER.LADDER-TYPES.BEDWARS.DESCRIPTION", BedWars.class ) @@ -135,7 +134,7 @@ public enum LadderType { FIREBALL_FIGHT(LadderTypeConfig.builder( "LADDER.LADDER-TYPES.FIREBALL-FIGHT.NAME", - ClassImport.getClasses().getItemMaterialUtil().getFireball(), + Material.FIRE_CHARGE, "LADDER.LADDER-TYPES.FIREBALL-FIGHT.DESCRIPTION", FireballFight.class ) @@ -152,7 +151,7 @@ public enum LadderType { BRIDGES(LadderTypeConfig.builder( "LADDER.LADDER-TYPES.BRIDGES.NAME", - ClassImport.getClasses().getItemMaterialUtil().getStainedClay(), + Material.RED_TERRACOTTA, "LADDER.LADDER-TYPES.BRIDGES.DESCRIPTION", Bridges.class ) @@ -168,7 +167,7 @@ public enum LadderType { BATTLE_RUSH(LadderTypeConfig.builder( "LADDER.LADDER-TYPES.BATTLE-RUSH.NAME", - ClassImport.getClasses().getItemMaterialUtil().getLilyPad(), + Material.LILY_PAD, "LADDER.LADDER-TYPES.BATTLE-RUSH.DESCRIPTION", BattleRush.class ) diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/GoldenAppleSettingHandler.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/GoldenAppleSettingHandler.java index 754d9e1e5..f84660969 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/GoldenAppleSettingHandler.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/GoldenAppleSettingHandler.java @@ -1,8 +1,8 @@ package dev.nandi0813.practice.manager.ladder.settings.handlers; import dev.nandi0813.practice.manager.fight.match.Match; +import dev.nandi0813.practice.manager.fight.util.ModernItemCooldownHandler; import dev.nandi0813.practice.manager.ladder.settings.SettingHandler; -import dev.nandi0813.practice.module.util.ClassImport; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.Event; @@ -44,13 +44,8 @@ public boolean handleEvent(Event event, Match match, Player player) { return false; // Golden heads don't have cooldown } - ClassImport.getClasses().getItemCooldownHandler().handleGoldenAppleMatch( - player, - cooldown, - e, - "MATCH.COOLDOWN.GOLDEN-APPLE" - ); - // Return true only if the event was cancelled (cooldown was active) + ModernItemCooldownHandler.handleGoldenApple(player, cooldown, e); + return e.isCancelled(); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/HitDelaySettingHandler.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/HitDelaySettingHandler.java index 6cf0f380f..fc73c174b 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/HitDelaySettingHandler.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/settings/handlers/HitDelaySettingHandler.java @@ -1,8 +1,8 @@ package dev.nandi0813.practice.manager.ladder.settings.handlers; import dev.nandi0813.practice.manager.fight.match.Match; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.ladder.settings.SettingHandler; -import dev.nandi0813.practice.module.util.ClassImport; import org.bukkit.entity.Player; /** @@ -28,7 +28,7 @@ public void onMatchStart(Match match) { // For modern versions (1.9+), also set the attack speed attribute // This enables spam-clicking for combo mode when hitDelay is low - ClassImport.getClasses().getPlayerUtil().setAttackSpeed(player, hitDelay); + PlayerUtil.setAttackSpeed(player, hitDelay); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/BedWars.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/BedWars.java index 137c84880..3b810639e 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/BedWars.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/BedWars.java @@ -1,12 +1,14 @@ package dev.nandi0813.practice.manager.ladder.type; -import dev.nandi0813.practice.ZonePractice; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; +import dev.nandi0813.practice.manager.fight.util.BlockUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; import dev.nandi0813.practice.manager.ladder.abstraction.normal.BedFight; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.ladder.util.LadderUtil; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -16,7 +18,6 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.metadata.FixedMetadataValue; import org.jetbrains.annotations.NotNull; import static dev.nandi0813.practice.util.PermanentConfig.PLACED_IN_FIGHT; @@ -56,14 +57,14 @@ public boolean handleEvents(Event e, Match match) { private static void onBlockPlace(final @NotNull BlockPlaceEvent e, final @NotNull Match match) { Block block = e.getBlockPlaced(); if (block.getType().equals(Material.TNT)) { - ClassImport.getClasses().getLadderUtil().placeTnt(e, match); + LadderUtil.placeTnt(e, match); } else { - block.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), match)); - match.addBlockChange(ClassImport.createChangeBlock(e)); + BlockUtil.setMetadata(block, PLACED_IN_FIGHT, match); + match.addBlockChange(new ChangedBlock(e)); Block underBlock = e.getBlockPlaced().getLocation().subtract(0, 1, 0).getBlock(); - if (ClassImport.getClasses().getArenaUtil().turnsToDirt(underBlock)) - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(underBlock)); + if (ArenaUtil.turnsToDirt(underBlock)) + match.getFightChange().addArenaBlockChange(new ChangedBlock(underBlock)); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/FireballFight.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/FireballFight.java index 60ac9cfa8..ffe622ed7 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/FireballFight.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/FireballFight.java @@ -1,18 +1,17 @@ package dev.nandi0813.practice.manager.ladder.type; import dev.nandi0813.practice.ZonePractice; +import dev.nandi0813.practice.manager.arena.util.ArenaUtil; import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; import dev.nandi0813.practice.manager.fight.match.util.TeamUtil; -import dev.nandi0813.practice.manager.fight.util.BlockUtil; -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import dev.nandi0813.practice.manager.fight.util.ListenerUtil; +import dev.nandi0813.practice.manager.fight.util.*; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.CustomConfig; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; import dev.nandi0813.practice.manager.ladder.abstraction.normal.BedFight; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.ladder.util.LadderUtil; import lombok.Getter; import lombok.Setter; import org.bukkit.Material; @@ -34,8 +33,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; @@ -135,7 +132,7 @@ private static void onFireballLaunch(final @NotNull PlayerInteractEvent e, final Action action = e.getAction(); if (action != Action.RIGHT_CLICK_AIR && action != Action.RIGHT_CLICK_BLOCK) return; - ItemStack fireballItem = ClassImport.getClasses().getPlayerUtil().getItemInUse(player, ClassImport.getClasses().getItemMaterialUtil().getFireball()); + ItemStack fireballItem = PlayerUtil.getItemInUse(player, Material.FIRE_CHARGE); if (fireballItem == null) { return; } @@ -146,22 +143,21 @@ private static void onFireballLaunch(final @NotNull PlayerInteractEvent e, final if (ladder.fireballCooldown <= 0) return; - if (!ClassImport.getClasses().getItemCooldownHandler().handleFireballMatch( - player, ladder.fireballCooldown, "MATCH.COOLDOWN.FIREBALL")) { + if (!ModernItemCooldownHandler.handleFireballMatch(player, ladder.fireballCooldown)) { return; } - final Fireball fireball = ClassImport.getClasses().getPlayerUtil().shootFireball(player, FIREBALL_SPEED); - fireball.setMetadata(FIGHT_ENTITY, new FixedMetadataValue(ZonePractice.getInstance(), match)); - fireball.setMetadata(FIREBALL_FIGHT_FIREBALL, new FixedMetadataValue(ZonePractice.getInstance(), match)); + final Fireball fireball = PlayerUtil.shootFireball(player, FIREBALL_SPEED); + BlockUtil.setMetadata(fireball, FIGHT_ENTITY, match); + BlockUtil.setMetadata(fireball, FIREBALL_FIGHT_FIREBALL, match); fireball.setIsIncendiary(false); fireball.setShooter(player); fireballItem.setAmount(fireballItem.getAmount() - 1); if (fireballItem.getAmount() == 0) { - ClassImport.getClasses().getPlayerUtil().setItemInUseIf( + PlayerUtil.setItemInUseIf( player, - ClassImport.getClasses().getItemMaterialUtil().getFireball(), + Material.FIRE_CHARGE, null); } player.updateInventory(); @@ -187,14 +183,14 @@ public void run() { private static void onBlockPlace(final @NotNull BlockPlaceEvent e, final @NotNull Match match) { Block block = e.getBlockPlaced(); if (block.getType().equals(Material.TNT)) { - ClassImport.getClasses().getLadderUtil().placeTnt(e, match); + LadderUtil.placeTnt(e, match); } else { - block.setMetadata(PLACED_IN_FIGHT, new FixedMetadataValue(ZonePractice.getInstance(), match)); - match.addBlockChange(ClassImport.createChangeBlock(e)); + BlockUtil.setMetadata(block, PLACED_IN_FIGHT, match); + match.addBlockChange(new ChangedBlock(e)); Block underBlock = e.getBlockPlaced().getLocation().subtract(0, 1, 0).getBlock(); - if (ClassImport.getClasses().getArenaUtil().turnsToDirt(underBlock)) - match.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(underBlock)); + if (ArenaUtil.turnsToDirt(underBlock)) + match.getFightChange().addArenaBlockChange(new ChangedBlock(underBlock)); } } @@ -202,11 +198,11 @@ private static void onEntityDamageByEntity(final @NotNull EntityDamageByEntityEv if (!(e.getEntity() instanceof Player player)) return; if (e.getDamager() instanceof Fireball fireball) { - if (!fireball.hasMetadata(FIREBALL_FIGHT_FIREBALL)) { + if (!BlockUtil.hasMetadata(fireball, FIREBALL_FIGHT_FIREBALL)) { return; } - MetadataValue mv = BlockUtil.getMetadata(fireball, FIREBALL_FIGHT_FIREBALL); + Match mv = BlockUtil.getMetadata(fireball, FIREBALL_FIGHT_FIREBALL, Match.class); if (ListenerUtil.checkMetaData(mv)) { return; } @@ -224,21 +220,21 @@ private static void onEntityDamageByEntity(final @NotNull EntityDamageByEntityEv } e.setDamage(0); - ClassImport.getClasses().getPlayerUtil().applyFireballKnockback(player, fireball); + PlayerUtil.applyFireballKnockback(player, fireball); } else if (e.getDamager() instanceof TNTPrimed tnt) { - MetadataValue mv = BlockUtil.getMetadata(tnt, FIREBALL_FIGHT_TNT); + Match mv = BlockUtil.getMetadata(tnt, FIREBALL_FIGHT_TNT, Match.class); if (ListenerUtil.checkMetaData(mv)) { return; } - MetadataValue mv2 = BlockUtil.getMetadata(tnt, FIREBALL_FIGHT_TNT_SHOOTER); + Player mv2 = BlockUtil.getMetadata(tnt, FIREBALL_FIGHT_TNT_SHOOTER, Player.class); if (mv2 == null) { return; } - if (mv2.value() instanceof Player shooter) { + if (mv2 instanceof Player shooter) { if (shooter == player || !TeamUtil.isSaveTeamMate(match, shooter, player)) { - ClassImport.getClasses().getPlayerUtil().applyTntKnockback(player, tnt); + PlayerUtil.applyTntKnockback(player, tnt); e.setDamage(0); } else if (TeamUtil.isSaveTeamMate(match, shooter, player)) { e.setCancelled(true); @@ -253,7 +249,7 @@ private static void onEntityDamageByEntity(final @NotNull EntityDamageByEntityEv private static void onFireballHit(final @NotNull ProjectileHitEvent e) { Entity entity = e.getEntity(); - if (!entity.hasMetadata(FIREBALL_FIGHT_FIREBALL)) { + if (!BlockUtil.hasMetadata(entity, FIREBALL_FIGHT_FIREBALL)) { return; } @@ -267,17 +263,14 @@ private static void onFireballHit(final @NotNull ProjectileHitEvent e) { private static void onEntityExplode(@NotNull EntityExplodeEvent e) { Entity entity = e.getEntity(); - if (entity.hasMetadata(FIREBALL_FIGHT_FIREBALL)) { - MetadataValue fbMv = BlockUtil.getMetadata(entity, FIREBALL_FIGHT_FIREBALL); + if (BlockUtil.hasMetadata(entity, FIREBALL_FIGHT_FIREBALL)) { + Match fbMv = BlockUtil.getMetadata(entity, FIREBALL_FIGHT_FIREBALL, Match.class); if (ListenerUtil.checkMetaData(fbMv)) { e.blockList().clear(); return; } - if (!(fbMv.value() instanceof Match match)) { - e.blockList().clear(); - return; - } + Match match = fbMv; if (!(match.getLadder() instanceof FireballFight fireballFight) || !fireballFight.isFireballBlockDestroy()) { // Setting disabled — no block destruction from fireball, but don't cancel so the sound plays. @@ -291,12 +284,12 @@ private static void onEntityExplode(@NotNull EntityExplodeEvent e) { } // Setting enabled — only destroy player-placed blocks, not arena blocks. - e.blockList().removeIf(block -> !block.hasMetadata(PLACED_IN_FIGHT)); - } else if (entity.hasMetadata(FIREBALL_FIGHT_TNT) && entity.hasMetadata(FIREBALL_FIGHT_TNT_SHOOTER)) { - MetadataValue mv = BlockUtil.getMetadata(entity, FIREBALL_FIGHT_TNT); + e.blockList().removeIf(block -> !BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)); + } else if (BlockUtil.hasMetadata(entity, FIREBALL_FIGHT_TNT) && BlockUtil.hasMetadata(entity, FIREBALL_FIGHT_TNT_SHOOTER)) { + Match mv = BlockUtil.getMetadata(entity, FIREBALL_FIGHT_TNT, Match.class); if (ListenerUtil.checkMetaData(mv)) return; - if (!(mv.value() instanceof Match match)) return; + Match match = mv; if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) { e.blockList().clear(); return; @@ -305,9 +298,9 @@ private static void onEntityExplode(@NotNull EntityExplodeEvent e) { // Filter to only destroyable blocks — MatchTntListener will track + break them naturally. e.blockList().removeIf(block -> { if (block.getType().equals(Material.TNT)) return false; // keep → chain-explodes - if (ClassImport.getClasses().getArenaUtil().containsDestroyableBlock(match.getLadder(), block)) return false; // keep → destroyable - if (block.hasMetadata(PLACED_IN_FIGHT)) return false; // keep → player placed - if (block.getRelative(0, 1, 0).hasMetadata(PLACED_IN_FIGHT)) return true; // remove → support under player block + if (ArenaUtil.containsDestroyableBlock(match.getLadder(), block)) return false; // keep → destroyable + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) return false; // keep → player placed + if (BlockUtil.hasMetadata(block.getRelative(0, 1, 0), PLACED_IN_FIGHT)) return true; // remove → support under player block return true; // remove → pure arena block }); } @@ -322,9 +315,9 @@ private static void onBlockExplode(@NotNull org.bukkit.event.block.BlockExplodeE // Filter to only destroyable blocks — MatchTntListener will track + break them naturally. e.blockList().removeIf(block -> { if (block.getType().equals(Material.TNT)) return false; // keep → chain-explodes - if (ClassImport.getClasses().getArenaUtil().containsDestroyableBlock(match.getLadder(), block)) return false; // keep → destroyable - if (block.hasMetadata(PLACED_IN_FIGHT)) return false; // keep → player placed - if (block.getRelative(0, 1, 0).hasMetadata(PLACED_IN_FIGHT)) return true; // remove → support under player block + if (ArenaUtil.containsDestroyableBlock(match.getLadder(), block)) return false; // keep → destroyable + if (BlockUtil.hasMetadata(block, PLACED_IN_FIGHT)) return false; // keep → player placed + if (BlockUtil.hasMetadata(block.getRelative(0, 1, 0), PLACED_IN_FIGHT)) return true; // remove → support under player block return true; // remove → pure arena block }); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/SkyWars.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/SkyWars.java index d0cdcd5bb..f7b9d7eca 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/SkyWars.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/SkyWars.java @@ -4,11 +4,11 @@ import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; import dev.nandi0813.practice.manager.fight.match.util.MatchUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.CustomConfig; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.ItemSerializationUtil; import lombok.Getter; import lombok.Setter; @@ -83,10 +83,10 @@ private static void onSkyWarsChestLoot(final @NotNull PlayerInteractEvent e, fin match.addEntityChange(player.getWorld().dropItemNaturally(chest.getLocation(), item)); } - match.addBlockChange(ClassImport.createChangeBlock(chest)); + match.addBlockChange(new ChangedBlock(chest)); Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> - chest.setType(Material.AIR), 2L); + chest.setBlockData(Material.AIR.createBlockData()), 2L); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Spleef.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Spleef.java index fb898342a..fce9b6848 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Spleef.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Spleef.java @@ -2,12 +2,13 @@ import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; +import dev.nandi0813.practice.manager.fight.util.BlockUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.fight.util.DeathCause; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.CustomConfig; import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.PermanentConfig; import lombok.Getter; import lombok.Setter; @@ -22,7 +23,6 @@ import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; import org.bukkit.util.BlockIterator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -66,19 +66,18 @@ private void onSpleefBlockBreak(final @NotNull BlockBreakEvent e, final @NotNull if (match.getCurrentStat(player).isSet()) return; Block snow = e.getBlock(); - if (snow == null) return; if (!match.getArena().getCuboid().contains(snow)) return; e.setCancelled(true); if (snow.getType().equals(Material.SNOW_BLOCK)) { - match.addBlockChange(ClassImport.createChangeBlock(snow)); - snow.setType(Material.AIR); + match.addBlockChange(new ChangedBlock(snow)); + snow.setBlockData(Material.AIR.createBlockData()); // Give one snowball per block broken when snowball mode is active. // Uses the version-abstracted getSnowball() (SNOW_BALL on 1.8.8, SNOWBALL on modern). if (snowballMode) { player.getInventory().addItem( - new ItemStack(ClassImport.getClasses().getItemMaterialUtil().getSnowball(), 1)); + new ItemStack(Material.SNOWBALL, 1)); player.updateInventory(); } } @@ -95,8 +94,8 @@ private void onSnowballHit(final @NotNull ProjectileHitEvent e, final @NotNull M if (!(e.getEntity() instanceof Snowball snowball)) return; // Only handle snowballs that belong to this match. - MetadataValue mv = snowball.getMetadata(PermanentConfig.FIGHT_ENTITY).stream().findFirst().orElse(null); - if (mv == null || !(mv.value() instanceof Match hitMatch) || !hitMatch.equals(match)) return; + Match hitMatch = BlockUtil.getMetadata(snowball, PermanentConfig.FIGHT_ENTITY, Match.class); + if (hitMatch == null || !hitMatch.equals(match)) return; if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) return; @@ -105,8 +104,8 @@ private void onSnowballHit(final @NotNull ProjectileHitEvent e, final @NotNull M if (!hitBlock.getType().equals(Material.SNOW_BLOCK)) return; if (!match.getArena().getCuboid().contains(hitBlock)) return; - match.addBlockChange(ClassImport.createChangeBlock(hitBlock)); - hitBlock.setType(Material.AIR); + match.addBlockChange(new ChangedBlock(hitBlock)); + hitBlock.setBlockData(Material.AIR.createBlockData()); } /** @@ -144,9 +143,9 @@ private static void whenFall(final @NotNull PlayerMoveEvent e, final @NotNull Ma if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) return; Material block = player.getLocation().getBlock().getType(); - if (block.equals(Material.WATER) || block.equals(ClassImport.getClasses().getItemMaterialUtil().getWater())) { + if (block.equals(Material.WATER)) { match.killPlayer(player, null, DeathCause.SPLEEF.getMessage()); - } else if (block.equals(Material.LAVA) || block.equals(ClassImport.getClasses().getItemMaterialUtil().getLava())) { + } else if (block.equals(Material.LAVA)) { match.killPlayer(player, null, DeathCause.SPLEEF.getMessage()); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Sumo.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Sumo.java index 875b5e054..cbb7ff5b1 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Sumo.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/type/Sumo.java @@ -6,7 +6,6 @@ import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.ladder.enums.LadderType; -import dev.nandi0813.practice.module.util.ClassImport; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.Event; @@ -44,13 +43,11 @@ private static void onPlayerMove(final @NotNull PlayerMoveEvent e, final @NotNul Material blockBelow = playerLoc.clone().subtract(0, 1, 0).getBlock().getType(); // Check if player is in/touching water - if (blockAtPlayer.equals(Material.WATER) || blockAtPlayer.equals(ClassImport.getClasses().getItemMaterialUtil().getWater()) || - blockBelow.equals(Material.WATER) || blockBelow.equals(ClassImport.getClasses().getItemMaterialUtil().getWater())) { + if (blockAtPlayer.equals(Material.WATER) || blockBelow.equals(Material.WATER)) { match.killPlayer(player, null, DeathCause.SUMO.getMessage()); } // Check if player is in/touching lava - else if (blockAtPlayer.equals(Material.LAVA) || blockAtPlayer.equals(ClassImport.getClasses().getItemMaterialUtil().getLava()) || - blockBelow.equals(Material.LAVA) || blockBelow.equals(ClassImport.getClasses().getItemMaterialUtil().getLava())) { + else if (blockAtPlayer.equals(Material.LAVA) || blockBelow.equals(Material.LAVA)) { match.killPlayer(player, null, DeathCause.SUMO.getMessage()); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/ladder/util/LadderUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/ladder/util/LadderUtil.java index eeda0b149..d8262a277 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/ladder/util/LadderUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/ladder/util/LadderUtil.java @@ -3,10 +3,11 @@ import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.arena.ArenaManager; import dev.nandi0813.practice.manager.arena.arenas.Arena; -import dev.nandi0813.practice.manager.arena.arenas.interfaces.DisplayArena; import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.backend.MysqlManager; +import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.MatchManager; +import dev.nandi0813.practice.manager.fight.util.BlockUtil; import dev.nandi0813.practice.manager.gui.GUI; import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; @@ -15,6 +16,7 @@ import dev.nandi0813.practice.manager.gui.setup.ladder.LadderSetupManager; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; +import dev.nandi0813.practice.manager.ladder.type.FireballFight; import dev.nandi0813.practice.manager.ladder.type.SkyWars; import dev.nandi0813.practice.manager.leaderboard.LeaderboardManager; import dev.nandi0813.practice.manager.leaderboard.types.LbMainType; @@ -22,13 +24,30 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.util.Common; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionType; +import org.jetbrains.annotations.NotNull; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.*; +import static dev.nandi0813.practice.util.PermanentConfig.FIGHT_ENTITY; + public enum LadderUtil { ; @@ -42,10 +61,6 @@ public static void changeStatus(Player player, NormalLadder ladder) { Common.sendMMMessage(player, LanguageManager.getString("LADDER.STATUS-CHANGE.NO-CONTENT")); return; } - if (ladder.getMatchTypes().isEmpty()) { - Common.sendMMMessage(player, LanguageManager.getString("LADDER.STATUS-CHANGE.NO-MATCHTYPE-ASSIGNED")); - return; - } if (ladder instanceof SkyWars && ((SkyWars) ladder).getSkyWarsLoot() == null) { Common.sendMMMessage(player, LanguageManager.getString("LADDER.STATUS-CHANGE.SKYWARS.NO-LOOT")); return; @@ -191,4 +206,124 @@ public static List getLadderNames(List ladders) { return names; } + public static void loadInventory(Player player, ItemStack[] armor, ItemStack[] inventory, ItemStack[] extra) { + player.getInventory().setArmorContents(armor); + player.getInventory().setStorageContents(inventory); + player.getInventory().setExtraContents(extra); + } + + private static final String[] MATERIAL_TYPES = { + "_WOOL", "_STAINED_CLAY", "_STAINED_GLASS", "_STAINED_GLASS_PANE", "_CARPET", + "_CONCRETE", "_CONCRETE_POWDER", "_TERRACOTTA", "_GLAZED_TERRACOTTA", "_CANDLE", "_BANNER" + }; + + public static ItemStack changeItemColor(@NotNull ItemStack item, Component teamColor) { + String itemType = item.getType().toString(); + TextColor textColor = teamColor.color(); + Color color = Color.YELLOW; + if (textColor != null) { + color = Color.fromRGB( + Objects.requireNonNull(teamColor.color()).red(), + Objects.requireNonNull(teamColor.color()).green(), + Objects.requireNonNull(teamColor.color()).blue() + ); + } + + if (item.getType().name().startsWith("LEATHER_")) { + LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta(); + if (meta != null) { + meta.setColor(color); + item.setItemMeta(meta); + } + return item; + } + + for (String type : MATERIAL_TYPES) { + if (itemType.contains(type) && textColor != null) { + try { + Material material = Material.getMaterial(textColor.toString().toUpperCase() + type); + + if (material != null) { + return item.withType(material); + } + } catch (Exception ignored) { + break; + } + } + } + + return item; + } + + public static ItemStack getPotionItem(String string) { + try { + if (string.contains("::")) { + String[] split = string.split("::"); + ItemStack itemStack = new ItemStack(Material.valueOf(split[0])); + + PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); + if (potionMeta != null) + potionMeta.setBasePotionType(PotionType.valueOf(split[1])); + + itemStack.setItemMeta(potionMeta); + return itemStack; + } + } catch (Exception e) { + Common.sendConsoleMMMessage("Invalid item: " + string); + } + return null; + } + + public static boolean isUnbreakable(ItemStack item) { + if (item.hasItemMeta() && item.getItemMeta() != null) { + return item.getItemMeta().isUnbreakable(); + } + return false; + } + + public static ItemMeta setUnbreakable(ItemMeta itemMeta, boolean unbreakable) { + if (itemMeta != null) { + itemMeta.setUnbreakable(unbreakable); + } + return itemMeta; + } + + public static ItemStack setDurability(ItemStack itemStack, int durability) { + if (itemStack.getItemMeta() != null) { + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta instanceof Damageable damageable) { + int newDamage = itemStack.getType().getMaxDurability() - durability; + if (newDamage < 0 || newDamage > itemStack.getType().getMaxDurability()) { + newDamage = itemStack.getType().getMaxDurability(); + } + + damageable.setDamage(newDamage); + itemStack.setItemMeta(damageable); + return itemStack; + } + } + return itemStack; + } + + public static void placeTnt(BlockPlaceEvent e, Match match) { + Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { + if (e.isCancelled()) { + return; + } + + Block block = e.getBlock(); + block.setBlockData(Material.AIR.createBlockData()); + block.getState().update(); + + TNTPrimed tnt = (TNTPrimed) block.getWorld().spawnEntity(block.getLocation().subtract(-0.5, 0, -0.5), EntityType.TNT); + BlockUtil.setMetadata(tnt, FIGHT_ENTITY, match); + tnt.setIsIncendiary(false); + + if (match.getLadder() instanceof FireballFight) { + BlockUtil.setMetadata(tnt, FireballFight.FIREBALL_FIGHT_TNT, match); + BlockUtil.setMetadata(tnt, FireballFight.FIREBALL_FIGHT_TNT_SHOOTER, e.getPlayer()); + } + }, 2L); + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/ArmorStandFactory.java b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/ArmorStandFactory.java deleted file mode 100644 index 6e51bc22e..000000000 --- a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/ArmorStandFactory.java +++ /dev/null @@ -1,98 +0,0 @@ -package dev.nandi0813.practice.manager.leaderboard.hologram; - -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.util.StringUtil; -import lombok.experimental.UtilityClass; -import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Factory for creating and configuring hologram armor stands. - * Centralizes all armor stand creation logic to prevent code duplication. - */ -@UtilityClass -public class ArmorStandFactory { - - /** - * Creates a new hologram armor stand at the specified location. - * - * @param location The location to spawn at (must have a valid world) - * @param text The display text (will be color-coded) - * @return The created ArmorStand, or null if location is invalid - */ - @Nullable - public ArmorStand create(@NotNull Location location, @NotNull String text) { - if (location.getWorld() == null) { - return null; - } - - ArmorStand stand = (ArmorStand) location.getWorld().spawnEntity(location, EntityType.ARMOR_STAND); - configure(stand, text); - return stand; - } - - /** - * Configures an armor stand for hologram display. - * - * @param stand The armor stand to configure - * @param text The display text (will be color-coded) - */ - public void configure(@NotNull ArmorStand stand, @NotNull String text) { - stand.setVisible(false); - stand.setGravity(false); - stand.setCustomNameVisible(true); - stand.setCustomName(StringUtil.CC(text)); - stand.setBasePlate(false); - stand.setArms(false); - ClassImport.getClasses().getArenaUtil().setArmorStandInvulnerable(stand); - } - - /** - * Updates the display text of an armor stand. - * - * @param stand The armor stand to update - * @param text The new display text (will be color-coded) - */ - public void updateText(@NotNull ArmorStand stand, @NotNull String text) { - stand.setCustomName(StringUtil.CC(text)); - } - - /** - * Checks if an entity is a hologram armor stand. - * Hologram armor stands are invisible with custom names visible. - * - * @param entity The entity to check - * @return true if it's a hologram armor stand - */ - public boolean isHologramArmorStand(@Nullable Entity entity) { - return entity instanceof ArmorStand stand - && !stand.isVisible() - && stand.isCustomNameVisible(); - } - - /** - * Safely removes an armor stand if it exists and is not dead. - * - * @param stand The armor stand to remove (can be null) - */ - public void safeRemove(@Nullable ArmorStand stand) { - if (stand != null && !stand.isDead()) { - stand.remove(); - } - } - - /** - * Checks if an armor stand is alive and valid for use. - * - * @param stand The armor stand to check (can be null) - * @return true if the armor stand is alive - */ - public boolean isAlive(@Nullable ArmorStand stand) { - return stand != null && !stand.isDead(); - } -} - diff --git a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java index 7c4fa2c7a..eb13e9b51 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/Hologram.java @@ -23,7 +23,10 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -36,7 +39,7 @@ *
  • Each hologram maintains a List of HologramLines
  • *
  • Smart updates only modify changed content (no flicker)
  • *
  • Thread-safe with atomic state tracking
  • - *
  • Auto-recovery for externally removed armor stands
  • + *
  • Auto-recovery for externally removed text displays
  • * */ @Getter @@ -45,7 +48,7 @@ public abstract class Hologram { // Configuration protected static final YamlConfiguration config = BackendManager.getConfig(); private static final String NULL_LINE_FORMAT = ConfigManager.getString("LEADERBOARD.HOLOGRAM.FORMAT.NULL-LINE"); - private static final double DEFAULT_SPACING = 0.3; + private static final double DEFAULT_SPACING = 0.25; // Core properties protected final String name; @@ -175,7 +178,7 @@ private synchronized void updateSmartly(@NotNull List textLines, @NotNul } } - private static final double BASE_HEIGHT_OFFSET = 0.3; // 0.3 block offset to raise holograms + private static final double BASE_HEIGHT_OFFSET = 2.2; private List calculatePositions(int count, List spacings) { List positions = new ArrayList<>(); @@ -434,6 +437,10 @@ public void setEnabled(boolean enabled) { } else { this.enabled = false; hologramRunnable.cancel(true); + + // Show setup placeholder immediately when hologram is disabled. + despawn(); + setSetupHologram(SetupHologramType.SETUP); } setData(); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramLine.java b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramLine.java index 0bc995dc0..44a71f156 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramLine.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramLine.java @@ -3,19 +3,19 @@ import lombok.Getter; import lombok.Setter; import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.TextDisplay; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Represents a single line in a hologram display. - * Each HologramLine manages exactly ONE ArmorStand entity with strict lifecycle management. + * Each HologramLine manages exactly ONE TextDisplay entity with strict lifecycle management. * *

    Key responsibilities:

    *
      - *
    • Spawning/despawning armor stand entities
    • + *
    • Spawning/despawning text display entities
    • *
    • Updating display text without flicker
    • - *
    • Auto-recovery when armor stands are removed externally
    • + *
    • Auto-recovery when displays are removed externally
    • *
    • Thread-safe state tracking
    • *
    */ @@ -23,7 +23,7 @@ public class HologramLine { @Setter - private ArmorStand entity; + private TextDisplay entity; private Location location; private String text = ""; private boolean spawned; @@ -37,17 +37,17 @@ public HologramLine() { } /** - * Spawns the armor stand at the specified location. + * Spawns the text display at the specified location. * This method is idempotent - calling multiple times won't create duplicates. * * @param loc The spawn location * @param text The display text (supports color codes) - * @return The spawned ArmorStand, or existing one if already spawned + * @return The spawned TextDisplay, or existing one if already spawned */ @Nullable - public ArmorStand spawn(@NotNull Location loc, @NotNull String text) { + public TextDisplay spawn(@NotNull Location loc, @NotNull String text) { // Return existing if already alive - if (spawned && ArmorStandFactory.isAlive(entity)) { + if (spawned && TextDisplayFactory.isAlive(entity)) { return entity; } @@ -58,14 +58,14 @@ public ArmorStand spawn(@NotNull Location loc, @NotNull String text) { return null; } - this.entity = ArmorStandFactory.create(location, text); + this.entity = TextDisplayFactory.create(location, text); this.spawned = (entity != null); return entity; } /** - * Despawns and removes the armor stand entity. + * Despawns and removes the text display entity. * The line can be respawned later with {@link #spawn(Location, String)}. */ public void despawn() { @@ -73,14 +73,14 @@ public void despawn() { return; } - ArmorStandFactory.safeRemove(entity); + TextDisplayFactory.safeRemove(entity); entity = null; spawned = false; } /** * Updates the display text. - * If the armor stand was externally removed, it will be automatically respawned. + * If the display was externally removed, it will be automatically respawned. * * @param newText The new display text (supports color codes) */ @@ -88,19 +88,19 @@ public void updateText(@NotNull String newText) { this.text = newText; // If entity is alive, just update the text - if (ArmorStandFactory.isAlive(entity)) { - ArmorStandFactory.updateText(entity, newText); + if (TextDisplayFactory.isAlive(entity)) { + TextDisplayFactory.updateText(entity, newText); return; } // Auto-respawn if entity was killed externally if (spawned && location != null && location.getWorld() != null) { - this.entity = ArmorStandFactory.create(location, newText); + this.entity = TextDisplayFactory.create(location, newText); } } /** - * Teleports the armor stand to a new location. + * Teleports the text display to a new location. * * @param newLoc The new location * @return true if teleported successfully @@ -115,12 +115,12 @@ public boolean teleport(@NotNull Location newLoc) { } /** - * Checks if this line has a valid, alive armor stand. + * Checks if this line has a valid, alive text display. * * @return true if the entity is alive */ public boolean isValid() { - return spawned && ArmorStandFactory.isAlive(entity); + return spawned && TextDisplayFactory.isAlive(entity); } /** @@ -132,7 +132,7 @@ public double getY() { if (location != null) { return location.getY(); } - return ArmorStandFactory.isAlive(entity) ? entity.getLocation().getY() : 0; + return TextDisplayFactory.isAlive(entity) ? entity.getLocation().getY() : 0; } /** @@ -151,7 +151,7 @@ public boolean update(@NotNull Location newLoc, @NotNull String newText) { this.text = newText; entity.teleport(newLoc); - ArmorStandFactory.updateText(entity, newText); + TextDisplayFactory.updateText(entity, newText); return true; } @@ -161,7 +161,7 @@ public boolean update(@NotNull Location newLoc, @NotNull String newText) { * Use as a recovery method when normal despawn might not work. */ public void forceClean() { - ArmorStandFactory.safeRemove(entity); + TextDisplayFactory.safeRemove(entity); entity = null; spawned = false; } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramProtectionListener.java b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramProtectionListener.java index a827fa69a..83e92ee17 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramProtectionListener.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/HologramProtectionListener.java @@ -2,25 +2,21 @@ import dev.nandi0813.practice.ZonePractice; import org.bukkit.Bukkit; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.world.ChunkUnloadEvent; import java.util.Arrays; /** - * Protects hologram armor stands from external removal/damage. + * Protects hologram text displays from external removal/damage. * *

    Protection mechanisms:

    *
      - *
    • Rapid health check (every 5 ticks) to detect and respawn dead armor stands
    • + *
    • Rapid health check (every 5 ticks) to detect and respawn removed displays
    • *
    • Damage event cancellation
    • - *
    • Death event recovery
    • *
    • Chunk unload protection
    • *
    */ @@ -45,7 +41,7 @@ public static void register() { } /** - * Starts a frequent health check to ensure all hologram armor stands are alive. + * Starts a frequent health check to ensure all hologram displays are alive. */ private void startHealthCheck() { Bukkit.getScheduler().runTaskTimer(ZonePractice.getInstance(), this::checkAndRepairHolograms, @@ -53,94 +49,41 @@ private void startHealthCheck() { } /** - * Checks all holograms and respawns any dead armor stands. + * Checks all holograms and respawns any removed displays. */ private void checkAndRepairHolograms() { HologramManager.getInstance().getHolograms().stream() .filter(Hologram::isEnabled) .flatMap(hologram -> hologram.getLines().stream()) - .filter(line -> !ArmorStandFactory.isAlive(line.getEntity())) + .filter(line -> !TextDisplayFactory.isAlive(line.getEntity())) .filter(line -> line.getLocation() != null && line.getLocation().getWorld() != null) .forEach(this::respawnLine); } /** - * Respawns a hologram line's armor stand. + * Respawns a hologram line's text display. */ private void respawnLine(HologramLine line) { - ArmorStand newStand = ArmorStandFactory.create(line.getLocation(), line.getText()); - line.setEntity(newStand); + line.setEntity(TextDisplayFactory.create(line.getLocation(), line.getText())); } /** - * Cancels all damage to hologram armor stands. + * Cancels all damage to hologram text displays. */ @EventHandler(priority = EventPriority.LOWEST) public void onEntityDamage(EntityDamageEvent event) { - if (ArmorStandFactory.isHologramArmorStand(event.getEntity())) { + if (TextDisplayFactory.isHologramTextDisplay(event.getEntity())) { event.setCancelled(true); } } /** - * Respawns hologram armor stands that somehow died. - */ - @EventHandler(priority = EventPriority.MONITOR) - public void onEntityDeath(EntityDeathEvent event) { - Entity entity = event.getEntity(); - - if (!ArmorStandFactory.isHologramArmorStand(entity)) { - return; - } - - ArmorStand deadStand = (ArmorStand) entity; - String customName = deadStand.getCustomName(); - var location = deadStand.getLocation(); - - // Schedule respawn for next tick - Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> - findAndRespawnLine(deadStand, location, customName)); - } - - /** - * Finds the hologram line for a dead armor stand and respawns it. - */ - private void findAndRespawnLine(ArmorStand deadStand, org.bukkit.Location location, String customName) { - HologramManager.getInstance().getHolograms().stream() - .flatMap(hologram -> hologram.getLines().stream()) - .filter(line -> isMatchingLine(line, deadStand, location)) - .findFirst() - .ifPresent(line -> { - ArmorStand newStand = ArmorStandFactory.create(line.getLocation(), - customName != null ? customName : line.getText()); - line.setEntity(newStand); - }); - } - - /** - * Checks if a line matches the dead armor stand. - */ - private boolean isMatchingLine(HologramLine line, ArmorStand deadStand, org.bukkit.Location location) { - if (line.getEntity() == deadStand) { - return true; - } - org.bukkit.Location lineLocation = line.getLocation(); - if (lineLocation == null || lineLocation.getWorld() == null || location.getWorld() == null) { - return false; - } - if (!lineLocation.getWorld().equals(location.getWorld())) { - return false; - } - return lineLocation.distanceSquared(location) < 0.5; - } - - /** - * Prevents chunk unloading from affecting hologram armor stands. + * Prevents chunk unloading from affecting hologram text displays. */ @EventHandler(priority = EventPriority.HIGHEST) public void onChunkUnload(ChunkUnloadEvent event) { boolean hasHologram = Arrays.stream(event.getChunk().getEntities()) - .anyMatch(ArmorStandFactory::isHologramArmorStand); + .anyMatch(TextDisplayFactory::isHologramTextDisplay); if (hasHologram) { Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/TextDisplayFactory.java b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/TextDisplayFactory.java new file mode 100644 index 000000000..71016ed2f --- /dev/null +++ b/core/src/main/java/dev/nandi0813/practice/manager/leaderboard/hologram/TextDisplayFactory.java @@ -0,0 +1,114 @@ +package dev.nandi0813.practice.manager.leaderboard.hologram; + +import dev.nandi0813.practice.ZonePractice; +import lombok.experimental.UtilityClass; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.Color; +import org.bukkit.Location; +import org.bukkit.entity.Display; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.TextDisplay; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Factory for creating and configuring hologram text displays. + * Centralizes all text display creation logic to prevent code duplication. + */ +@UtilityClass +public class TextDisplayFactory { + + /** + * Creates a new hologram text display at the specified location. + * + * @param location The location to spawn at (must have a valid world) + * @param text The display text (will be color-coded) + * @return The created TextDisplay, or null if location is invalid + */ + @Nullable + public TextDisplay create(@NotNull Location location, @NotNull String text) { + if (location.getWorld() == null) { + return null; + } + + TextDisplay display = (TextDisplay) location.getWorld().spawnEntity(location, EntityType.TEXT_DISPLAY); + configure(display, text); + return display; + } + + /** + * Configures a text display for hologram display. + * + * @param display The text display to configure + * @param text The display text (supports legacy formatting) + */ + public void configure(@NotNull TextDisplay display, @NotNull String text) { + display.text(deserializeText(text)); + display.setBillboard(Display.Billboard.CENTER); + display.setDefaultBackground(false); + display.setBackgroundColor(Color.fromARGB(0, 0, 0, 0)); + display.setShadowed(true); + display.setGravity(false); + display.setInvulnerable(true); + display.setPersistent(false); + display.setSilent(true); + display.setSeeThrough(false); + } + + /** + * Updates the display text of a text display. + * + * @param display The text display to update + * @param text The new display text + */ + public void updateText(@NotNull TextDisplay display, @NotNull String text) { + display.text(deserializeText(text)); + } + + private Component deserializeText(@NotNull String text) { + if (text.contains("<") && text.contains(">")) { + return ZonePractice.getMiniMessage().deserialize(text); + } + return LegacyComponentSerializer.legacySection().deserialize(text.replace('&', LegacyComponentSerializer.SECTION_CHAR)); + } + + /** + * Checks if an entity is a hologram text display. + * + * @param entity The entity to check + * @return true if it's a hologram text display + */ + public boolean isHologramTextDisplay(@Nullable Entity entity) { + return entity instanceof TextDisplay display + && display.getBillboard() == Display.Billboard.CENTER + && !display.isDefaultBackground() + && display.isShadowed() + && !display.isPersistent(); + } + + /** + * Safely removes a text display if it exists and is not dead. + * + * @param display The text display to remove (can be null) + */ + public void safeRemove(@Nullable TextDisplay display) { + if (display != null && !display.isDead()) { + display.remove(); + } + } + + /** + * Checks if a text display is alive and valid for use. + * + * @param display The text display to check (can be null) + * @return true if the text display is alive + */ + public boolean isAlive(@Nullable TextDisplay display) { + return display != null && !display.isDead(); + } +} + + + diff --git a/core/src/main/java/dev/nandi0813/practice/manager/nametag/FakeTeam.java b/core/src/main/java/dev/nandi0813/practice/manager/nametag/FakeTeam.java index 6257bf7c8..c2a3229fa 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/nametag/FakeTeam.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/nametag/FakeTeam.java @@ -1,6 +1,5 @@ package dev.nandi0813.practice.manager.nametag; -import dev.nandi0813.practice.module.util.VersionChecker; import lombok.Data; import lombok.Getter; import net.kyori.adventure.text.Component; @@ -8,7 +7,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; @Data public class FakeTeam { @@ -33,12 +31,7 @@ public FakeTeam(Component prefix, NamedTextColor nameColor, Component suffix, in generatedName = NametagManager.generateUUID() + "_" + getNameFromInput(sortPriority) + ID; } this.name = generatedName; - - if (Objects.equals(VersionChecker.getBukkitVersion(), VersionChecker.BukkitVersion.v1_8_R3)) { - this.name = this.name.length() > 16 ? this.name.substring(0, 16) : this.name; - } else { - this.name = this.name.length() > 256 ? this.name.substring(0, 256) : this.name; - } + this.name = this.name.length() > 256 ? this.name.substring(0, 256) : this.name; this.prefix = prefix; this.nameColor = nameColor; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java b/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java index e2986a944..94f28f57b 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/nametag/NametagManager.java @@ -1,6 +1,7 @@ package dev.nandi0813.practice.manager.nametag; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerTeams; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.util.PermanentConfig; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -279,7 +280,7 @@ private void preserveTabListName(Player player) { } // Set the tab list name to maintain lobby formatting - dev.nandi0813.practice.module.util.ClassImport.getClasses().getPlayerUtil().setPlayerListName(player, tabListName); + PlayerUtil.setPlayerListName(player, tabListName); } catch (Exception e) { // Silently fail - this is a best-effort preservation } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/nametag/TabIntegration.java b/core/src/main/java/dev/nandi0813/practice/manager/nametag/TabIntegration.java index 29440df8f..5907ed1ad 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/nametag/TabIntegration.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/nametag/TabIntegration.java @@ -1,11 +1,12 @@ package dev.nandi0813.practice.manager.nametag; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; +import dev.nandi0813.practice.util.PermanentConfig; import lombok.Getter; import me.neznamy.tab.api.TabAPI; import me.neznamy.tab.api.TabPlayer; import me.neznamy.tab.api.nametag.NameTagManager; import me.neznamy.tab.api.tablist.TabListFormatManager; -import dev.nandi0813.practice.util.PermanentConfig; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -120,12 +121,9 @@ public void setNametag(Player player, Component prefix, NamedTextColor nameColor prefixStr = prefixStr + colorCode; } nameTagManager.setPrefix(tabPlayer, prefixStr); - } else if (colorCode != null) { + } else { // No prefix text, but we have a color - set color as prefix nameTagManager.setPrefix(tabPlayer, colorCode); - } else { - // No prefix and no color - nameTagManager.setPrefix(tabPlayer, ""); } // Set the suffix @@ -431,9 +429,7 @@ private void preserveTabListNameInternal(Player player) { .append(lobbySuffix); // Use internal Bukkit method to set the tablist name (not TAB API) - dev.nandi0813.practice.module.util.ClassImport.getClasses() - .getPlayerUtil() - .setPlayerListName(player, tabListName); + PlayerUtil.setPlayerListName(player, tabListName); } catch (Exception e) { // Silently fail - this is best-effort diff --git a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/KitItems.java b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/KitItems.java index a91db9cb9..de92aba85 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/KitItems.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/KitItems.java @@ -1,18 +1,18 @@ package dev.nandi0813.practice.manager.playerkit; import dev.nandi0813.practice.manager.playerkit.items.KitItem; -import dev.nandi0813.practice.module.interfaces.KitData; -import dev.nandi0813.practice.module.util.VersionChecker; +import dev.nandi0813.practice.util.KitData; import lombok.Getter; import org.bukkit.inventory.ItemStack; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Getter public class KitItems { - private static final boolean SECOND_HAND = Objects.requireNonNull(VersionChecker.getBukkitVersion()).isSecondHand(); - private final KitData kitData; private final KitItem helmet; @@ -40,14 +40,10 @@ public KitItems(final KitData kitData) { boots = new KitItem(StaticItems.MAIN_GUI_BOOTS_PLACEHOLDER_ICON); } - if (SECOND_HAND) { - if (kitData.getExtra() != null) { - offhand = new KitItem(StaticItems.MAIN_GUI_OFF_HAND_PLACEHOLDER_ICON, kitData.getExtra()[0]); - } else { - offhand = new KitItem(StaticItems.MAIN_GUI_OFF_HAND_PLACEHOLDER_ICON); - } + if (kitData.getExtra() != null) { + offhand = new KitItem(StaticItems.MAIN_GUI_OFF_HAND_PLACEHOLDER_ICON, kitData.getExtra()[0]); } else { - offhand = null; + offhand = new KitItem(StaticItems.MAIN_GUI_OFF_HAND_PLACEHOLDER_ICON); } if (kitData.getStorage() != null) { @@ -75,10 +71,7 @@ private void assignSlots() { slots.put(11, chest); slots.put(12, legs); slots.put(13, boots); - - if (SECOND_HAND) { - slots.put(15, offhand); - } + slots.put(15, offhand); for (int i = 18; i <= 44; i++) { slots.put(i, inventory.get(i - 18)); @@ -126,12 +119,9 @@ public void resetNull() { } public void save() { - if (SECOND_HAND) { - List extraContent = new ArrayList<>(); - extraContent.add(offhand.get()); - this.kitData.setExtra(extraContent.toArray(new ItemStack[0])); - } - + List extraContent = new ArrayList<>(); + extraContent.add(offhand.get()); + this.kitData.setExtra(extraContent.toArray(new ItemStack[0])); this.kitData.setStorage(this.getInventoryContent().toArray(new ItemStack[0])); this.kitData.setArmor(this.getArmorContent().toArray(new ItemStack[0])); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/PlayerKitUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/PlayerKitUtil.java index a6720c81f..7bd5e5713 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/PlayerKitUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/PlayerKitUtil.java @@ -1,9 +1,11 @@ package dev.nandi0813.practice.manager.playerkit; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.ladder.util.LadderUtil; import dev.nandi0813.practice.util.Common; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; public enum PlayerKitUtil { ; @@ -16,7 +18,7 @@ public enum PlayerKitUtil { *
  • {@code MATERIAL} – plain material, e.g. {@code ARROW}
  • *
  • {@code MATERIAL::NUMBER} – material with a legacy damage/data value (1.8), e.g. {@code WOOL::14}
  • *
  • {@code MATERIAL::NAMED_TYPE} – material with a named sub-type resolved via - * {@link dev.nandi0813.practice.module.interfaces.LadderUtil#getPotionItem(String)}, + * {@link LadderUtil#getPotionItem(String)}, * e.g. {@code TIPPED_ARROW::LONG_NIGHT_VISION}, {@code LINGERING_POTION::SPEED}, * {@code SPLASH_POTION::STRENGTH}
  • * @@ -30,10 +32,16 @@ public static ItemStack getItem(String string) { // If the part after :: is numeric it's a legacy damage/data value (1.8 only) boolean isNumeric = suffix.chars().allMatch(Character::isDigit); if (isNumeric) { - return new ItemStack(Material.valueOf(split[0]), 1, Short.parseShort(suffix)); + ItemStack itemStack = new ItemStack(Material.valueOf(split[0]), 1); + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta instanceof Damageable damageable) { + damageable.setDamage(Short.parseShort(suffix)); + itemStack.setItemMeta(damageable); + } + return itemStack; } else { // Named sub-type (PotionType, etc.) – delegate to the version-specific impl - return ClassImport.getClasses().getLadderUtil().getPotionItem(string); + return LadderUtil.getPotionItem(string); } } else if (string.equalsIgnoreCase("")) { return new ItemStack(Material.AIR); diff --git a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/StaticItems.java b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/StaticItems.java index 4ec9ae634..aa260b925 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/StaticItems.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/StaticItems.java @@ -1,8 +1,8 @@ package dev.nandi0813.practice.manager.playerkit; import dev.nandi0813.practice.manager.gui.GUIItem; +import dev.nandi0813.practice.manager.ladder.util.LadderUtil; import dev.nandi0813.practice.manager.playerkit.items.EditorIcon; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Pair; import org.bukkit.enchantments.Enchantment; @@ -73,14 +73,14 @@ public enum StaticItems { static { for (String string : PlayerKitManager.getInstance().getList("GUI.ITEMS.ITEMS-GUI.CATEGORIES.POTION.SPLASH-POTIONS.ITEMS")) { - ItemStack itemStack = ClassImport.getClasses().getLadderUtil().getPotionItem(string); + ItemStack itemStack = LadderUtil.getPotionItem(string); if (itemStack != null) { POTIONS_GUI_SPLASH_POTIONS.add(itemStack); } } for (String string : PlayerKitManager.getInstance().getList("GUI.ITEMS.ITEMS-GUI.CATEGORIES.POTION.DRINKABLE-POTIONS.ITEMS")) { - ItemStack itemStack = ClassImport.getClasses().getLadderUtil().getPotionItem(string); + ItemStack itemStack = LadderUtil.getPotionItem(string); if (itemStack != null) { POTIONS_GUI_DRINKABLE_POTIONS.add(itemStack); } @@ -140,7 +140,10 @@ public enum StaticItems { List enchantments = new ArrayList<>(); for (String enchantment : PlayerKitManager.getInstance().getList("DISABLED-ENCHANTS." + path)) { try { - enchantments.add(Enchantment.getByName(enchantment)); + Enchantment parsed = Common.resolveEnchantment(enchantment); + if (parsed != null) { + enchantments.add(parsed); + } } catch (Exception e) { Common.sendConsoleMMMessage("Invalid enchantment name: " + enchantment); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/EnchantGUI.java b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/EnchantGUI.java index 0985d4f47..0b7b5819c 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/EnchantGUI.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/EnchantGUI.java @@ -6,6 +6,7 @@ import dev.nandi0813.practice.manager.gui.GUIType; import dev.nandi0813.practice.manager.playerkit.StaticItems; import dev.nandi0813.practice.manager.playerkit.items.KitItem; +import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; import dev.nandi0813.practice.util.StringUtil; import net.wesjd.anvilgui.AnvilGUI; @@ -46,7 +47,7 @@ public void build() { inventory.setItem(44, StaticItems.ENCHANT_GUI_CHANGE_DURABILITY_ICON); inventory.setItem(53, StaticItems.ENCHANT_GUI_CLEAR_ENCHANTS_ICON); - for (Enchantment enchantment : Enchantment.values()) { + for (Enchantment enchantment : Common.getAllEnchantments()) { String name = kitItem.getMaterial().name().toLowerCase(); if (!enchantment.canEnchantItem(kitItem.get())) @@ -63,7 +64,7 @@ public void build() { if (!disabled) { icons.put( - StaticItems.ENCHANT_GUI_ENCHANT_ICON.cloneItem().replace("%enchantment%", StringUtil.getNormalizedName(enchantment.getName())).get(), + StaticItems.ENCHANT_GUI_ENCHANT_ICON.cloneItem().replace("%enchantment%", StringUtil.getNormalizedName(enchantment.getKey().getKey())).get(), enchantment ); } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/MainGUI.java b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/MainGUI.java index 63a00bf36..7be1bd8b9 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/MainGUI.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/guis/MainGUI.java @@ -2,6 +2,7 @@ import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.gui.GUI; import dev.nandi0813.practice.manager.gui.GUIManager; import dev.nandi0813.practice.manager.gui.GUIType; @@ -14,7 +15,6 @@ import dev.nandi0813.practice.manager.playerkit.items.KitItem; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.InventoryUtil; import net.wesjd.anvilgui.AnvilGUI; @@ -217,7 +217,7 @@ public void handleCloseEvent(InventoryCloseEvent e) { public void open(Player player) { super.open(player); - ClassImport.getClasses().getPlayerUtil().setActiveInventoryTitle( + PlayerUtil.setActiveInventoryTitle( player, StaticItems.MAIN_GUI_TITLE.replace("%name%", customLadder.getDisplayName()) ); @@ -231,7 +231,7 @@ private static boolean canBeEnchanted(ItemStack itemStack) { return false; } - for (Enchantment enchantment : Enchantment.values()) { + for (Enchantment enchantment : Common.getAllEnchantments()) { if (enchantment.canEnchantItem(itemStack)) { return true; } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/items/KitItem.java b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/items/KitItem.java index 378f929d0..9f430d70f 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/playerkit/items/KitItem.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/playerkit/items/KitItem.java @@ -1,6 +1,7 @@ package dev.nandi0813.practice.manager.playerkit.items; -import dev.nandi0813.practice.module.util.ClassImport; +import dev.nandi0813.practice.manager.ladder.util.LadderUtil; +import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.StringUtil; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -82,25 +83,25 @@ public Material getMaterial() { } public boolean isUnbreakable() { - return ClassImport.getClasses().getLadderUtil().isUnbreakable(itemStack); + return LadderUtil.isUnbreakable(itemStack); } // Setters public KitItem setName(String name) { ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setDisplayName(StringUtil.CC(name)); + itemMeta.displayName(Common.legacyToComponent(StringUtil.CC(name))); itemStack.setItemMeta(itemMeta); return this; } public void setUnbreakable(boolean unbreakable) { ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta = ClassImport.getClasses().getLadderUtil().setUnbreakable(itemMeta, unbreakable); + itemMeta = LadderUtil.setUnbreakable(itemMeta, unbreakable); itemStack.setItemMeta(itemMeta); } public void setDurability(int durability) { - itemStack = ClassImport.getClasses().getLadderUtil().setDurability(itemStack, durability); + itemStack = LadderUtil.setDurability(itemStack, durability); } public KitItem setAmount(int amount) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java b/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java index 96ac30441..1613367ee 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/profile/Profile.java @@ -1,5 +1,6 @@ package dev.nandi0813.practice.manager.profile; +import dev.nandi0813.practice.manager.fight.match.MatchManager; import dev.nandi0813.practice.manager.fight.match.util.CustomKit; import dev.nandi0813.practice.manager.gui.guis.customladder.PlayerCustomKitSelector; import dev.nandi0813.practice.manager.gui.guis.profile.ProfileSettingsGui; @@ -10,9 +11,8 @@ import dev.nandi0813.practice.manager.profile.group.Group; import dev.nandi0813.practice.manager.profile.group.GroupManager; import dev.nandi0813.practice.manager.profile.statistics.ProfileStat; -import dev.nandi0813.practice.module.interfaces.actionbar.ActionBar; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; +import dev.nandi0813.practice.util.actionbar.ActionBar; import lombok.Getter; import lombok.Setter; import net.kyori.adventure.text.Component; @@ -72,7 +72,7 @@ public class Profile { private RankedBan rankedBan = new RankedBan(); private ProfileSettingsGui settingsGui; - private ActionBar actionBar = ClassImport.createActionBarClass(this); + private ActionBar actionBar = new ActionBar(this); // Custom ladder private PlayerCustomKitSelector playerCustomKitSelector; @@ -218,4 +218,20 @@ public void setSelectedCustomLadder(CustomLadder customLadder) { this.selectedCustomLadder = customLadder; } + public void setStatus(ProfileStatus status) { + ProfileStatus previous = this.status; + this.status = status; + + // Leaving lobby/spectate for a new activity invalidates pending rematches. + if ((previous == ProfileStatus.LOBBY || previous == ProfileStatus.SPECTATE) + && status != ProfileStatus.LOBBY + && status != ProfileStatus.SPECTATE + && status != ProfileStatus.OFFLINE) { + Player online = player.getPlayer(); + if (online != null && online.isOnline()) { + MatchManager.getInstance().invalidateRematchByPlayer(online); + } + } + } + } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/queue/QueueManager.java b/core/src/main/java/dev/nandi0813/practice/manager/queue/QueueManager.java index 144f8691e..a0036d17b 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/queue/QueueManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/queue/QueueManager.java @@ -3,11 +3,11 @@ import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.ConfigManager; import dev.nandi0813.practice.manager.backend.LanguageManager; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import lombok.Getter; import org.bukkit.Bukkit; @@ -86,7 +86,7 @@ public void createRankedQueue(Player player, NormalLadder ladder) { return; } - if (ClassImport.getClasses().getPlayerUtil().getPing(player) > ConfigManager.getInt("QUEUE.RANKED.MAX-PING")) { + if (PlayerUtil.getPing(player) > ConfigManager.getInt("QUEUE.RANKED.MAX-PING")) { Common.sendMMMessage(player, LanguageManager.getString("QUEUES.RANKED.HIGH-PING")); player.closeInventory(); return; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/queue/runnables/SearchRunnable.java b/core/src/main/java/dev/nandi0813/practice/manager/queue/runnables/SearchRunnable.java index d6be7bc8c..e84c9b243 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/queue/runnables/SearchRunnable.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/queue/runnables/SearchRunnable.java @@ -2,7 +2,7 @@ import dev.nandi0813.practice.manager.queue.Queue; import dev.nandi0813.practice.manager.queue.QueueManager; -import dev.nandi0813.practice.module.interfaces.actionbar.ActionBar; +import dev.nandi0813.practice.util.actionbar.ActionBar; import dev.nandi0813.practice.util.interfaces.Runnable; import org.bukkit.Bukkit; import org.bukkit.scheduler.BukkitTask; diff --git a/core/src/main/java/dev/nandi0813/practice/manager/server/MysqlSaveRunnable.java b/core/src/main/java/dev/nandi0813/practice/manager/server/MysqlSaveRunnable.java index 3fbd86045..02211b6e4 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/server/MysqlSaveRunnable.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/server/MysqlSaveRunnable.java @@ -9,7 +9,6 @@ import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.util.Common; import lombok.Getter; -import org.bukkit.ChatColor; import org.bukkit.scheduler.BukkitRunnable; import java.sql.PreparedStatement; @@ -64,7 +63,7 @@ public void loadGlobalMysqlData(Profile profile) { else division = profile.getStats().getDivision().getFullName(); - stmt.setString(10, ChatColor.stripColor(division)); + stmt.setString(10, Common.stripLegacyColor(division)); stmt.execute(); } catch (SQLException e) { Common.sendConsoleMMMessage("Error: " + e.getMessage()); @@ -85,7 +84,7 @@ public void loadGlobalMysqlData(Profile profile) { else division = profile.getStats().getDivision().getFullName(); - stmt.setString(10, ChatColor.stripColor(division)); + stmt.setString(10, Common.stripLegacyColor(division)); stmt.setString(9, profile.getUuid().toString()); stmt.execute(); } catch (SQLException e) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/server/ServerManager.java b/core/src/main/java/dev/nandi0813/practice/manager/server/ServerManager.java index 59369ebfd..b3f64ad01 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/server/ServerManager.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/server/ServerManager.java @@ -11,7 +11,6 @@ import dev.nandi0813.practice.manager.profile.ProfileManager; import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; import dev.nandi0813.practice.manager.sidebar.SidebarManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.GoldenHead; import dev.nandi0813.practice.util.StartUpTypes; @@ -113,20 +112,64 @@ public void loadOfflinePlayers() { public void loadLobby() { try { - // Reload backend to ensure Location objects are properly deserialized now that worlds are loaded + // Reload backend to ensure data is current now that worlds are loaded. BackendManager.reload(); - lobby = (Location) BackendManager.getConfig().get("lobby"); + + Object lobbyObj = BackendManager.getConfig().get("lobby"); + if (lobbyObj instanceof Location) { + // Old format: Location was stored as a ConfigurationSerializable ("==" key). + // Read it, then immediately migrate to the new primitive-field format so + // future async saves never attempt to serialize a Location object again. + lobby = (Location) lobbyObj; + if (lobby.getWorld() != null) { + writeLobbyPrimitives(lobby); + BackendManager.save(); + Common.sendConsoleMMMessage("Migrated lobby location to primitive-field format in backend.yml."); + } + } else if (BackendManager.getConfig().isConfigurationSection("lobby")) { + // New format: plain fields — world, x, y, z, yaw, pitch. + String worldName = BackendManager.getConfig().getString("lobby.world"); + if (worldName != null) { + World world = Bukkit.getWorld(worldName); + lobby = new Location( + world, + BackendManager.getConfig().getDouble("lobby.x"), + BackendManager.getConfig().getDouble("lobby.y"), + BackendManager.getConfig().getDouble("lobby.z"), + (float) BackendManager.getConfig().getDouble("lobby.yaw"), + (float) BackendManager.getConfig().getDouble("lobby.pitch") + ); + } + } } catch (Exception e) { Common.sendConsoleMMMessage("Lobby cannot be found."); } } + /** + * Writes the lobby location to the BackendManager config as individual primitive fields + * (world name + x/y/z/yaw/pitch) so that no {@link org.bukkit.configuration.serialization.ConfigurationSerializable} + * object is ever stored in the config. This prevents SnakeYAML from calling + * {@link Location#serialize()} during async saves, which can throw a NullPointerException + * if the Location's world {@code WeakReference} has been cleared. + */ + private void writeLobbyPrimitives(Location location) { + // Remove any existing entry (could be a Location object or an old section) + BackendManager.getConfig().set("lobby", null); + BackendManager.getConfig().set("lobby.world", location.getWorld().getName()); + BackendManager.getConfig().set("lobby.x", location.getX()); + BackendManager.getConfig().set("lobby.y", location.getY()); + BackendManager.getConfig().set("lobby.z", location.getZ()); + BackendManager.getConfig().set("lobby.yaw", (double) location.getYaw()); + BackendManager.getConfig().set("lobby.pitch", (double) location.getPitch()); + } + public void setLobby(Player player, Location newLobby) { lobby = newLobby; newLobby.getWorld().setSpawnLocation(newLobby.getBlockX(), newLobby.getBlockY(), newLobby.getBlockZ()); InventoryManager.getInstance().setLobbyInventory(player, true); - BackendManager.getConfig().set("lobby", lobby); + writeLobbyPrimitives(newLobby); BackendManager.save(); } @@ -167,7 +210,7 @@ public void onTeleport(PlayerTeleportEvent e) { if (from != null && !from.equals(WorldEnum.OTHER)) { if (profile.getStatus().equals(ProfileStatus.LOBBY)) { ProfileManager.getInstance().getProfile(player).setStatus(ProfileStatus.OFFLINE); - ClassImport.getClasses().getPlayerUtil().clearInventory(player); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); SidebarManager.getInstance().unLoadSidebar(player); } } diff --git a/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java b/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java index 85c3058a2..5ddfbf0ba 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/AdapterUtil.java @@ -10,12 +10,13 @@ import dev.nandi0813.practice.manager.fight.match.type.playersvsplayers.partysplit.PartySplit; import dev.nandi0813.practice.manager.fight.match.type.playersvsplayers.partyvsparty.PartyVsParty; import dev.nandi0813.practice.manager.fight.match.util.TeamUtil; +import dev.nandi0813.practice.manager.fight.util.PlayerUtil; import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; import dev.nandi0813.practice.manager.sidebar.SidebarManager; -import dev.nandi0813.practice.module.util.ClassImport; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextReplacementConfig; import org.bukkit.entity.Player; +import org.intellij.lang.annotations.RegExp; public enum AdapterUtil { ; @@ -27,14 +28,14 @@ public enum AdapterUtil { /** * Creates a text replacement config for a simple string replacement */ - private static TextReplacementConfig replace(String placeholder, String value) { + private static TextReplacementConfig replace(@RegExp String placeholder, String value) { return TextReplacementConfig.builder().match(placeholder).replacement(value).build(); } /** * Creates a text replacement config for a component replacement */ - private static TextReplacementConfig replace(String placeholder, Component value) { + private static TextReplacementConfig replace(@RegExp String placeholder, Component value) { return TextReplacementConfig.builder().match(placeholder).replacement(value).build(); } @@ -42,7 +43,7 @@ private static TextReplacementConfig replace(String placeholder, Component value * Gets player ping as string or "N/A" if offline */ private static String getPingString(Player player) { - return player.isOnline() ? String.valueOf(ClassImport.getClasses().getPlayerUtil().getPing(player)) : "N/A"; + return player.isOnline() ? String.valueOf(PlayerUtil.getPing(player)) : "N/A"; } /** @@ -54,7 +55,7 @@ private static Component replaceCommonMatchPlaceholders(Component line, Match ma .replaceText(replace("%totalRounds%", String.valueOf(match.getLadder().getRounds()))) .replaceText(replace("%roundDuration%", match.getCurrentRound().getFormattedTime())) .replaceText(replace("%matchDuration%", match.getFormattedTime())) - .replaceText(replace("%ping%", String.valueOf(ClassImport.getClasses().getPlayerUtil().getPing(player)))) + .replaceText(replace("%ping%", String.valueOf(PlayerUtil.getPing(player)))) .replaceText(replace("%arena%", match.getArena().getDisplayName())) .replaceText(replace("%ladder%", match.getLadder().getDisplayName())); } @@ -90,7 +91,7 @@ private static Component replacePartyFFAPlayerPlaceholders(Component line, Party /** * Replaces colored player name placeholders for boxing (team color + player name) */ - private static Component replaceColoredPlayerName(Component line, String placeholder, TeamEnum team, Player player) { + private static Component replaceColoredPlayerName(Component line, @RegExp String placeholder, TeamEnum team, Player player) { if (player == null) return line.replaceText(replace(placeholder, Component.empty())); return line.replaceText(replace(placeholder, team.getColor().append(Component.text(player.getName())))); } @@ -126,17 +127,12 @@ public static Component replaceMatchPlaceholders(Player player, Component line, line = replaceCommonMatchPlaceholders(line, match, player); // Handle match type specific placeholders - switch (match.getType()) { - case DUEL: - return handleDuelPlaceholders(line, (Duel) match, player); - case PARTY_FFA: - return handlePartyFFAPlaceholders(line, (PartyFFA) match, player); - case PARTY_SPLIT: - return handlePartySplitPlaceholders(line, (PartySplit) match); - case PARTY_VS_PARTY: - return handlePartyVsPartyPlaceholders(line, (PartyVsParty) match, player); - } - return line; + return switch (match.getType()) { + case DUEL -> handleDuelPlaceholders(line, (Duel) match, player); + case PARTY_FFA -> handlePartyFFAPlaceholders(line, (PartyFFA) match, player); + case PARTY_SPLIT -> handlePartySplitPlaceholders(line, (PartySplit) match); + case PARTY_VS_PARTY -> handlePartyVsPartyPlaceholders(line, (PartyVsParty) match, player); + }; } private static Component handleDuelPlaceholders(Component line, Duel duel, Player player) { @@ -203,7 +199,7 @@ public static Component replaceFFAPlaceholders(Player player, Component line, FF .replaceText(replace("%players%", String.valueOf(ffa.getPlayers().size()))) .replaceText(replace("%spectators%", String.valueOf(ffa.getSpectators().size()))) .replaceText(replace("%nextReset%", ffa.getBuildRollback() != null ? ffa.getBuildRollback().getFormattedTime() : "N/A")) - .replaceText(replace("%ping%", String.valueOf(ClassImport.getClasses().getPlayerUtil().getPing(player)))) + .replaceText(replace("%ping%", String.valueOf(PlayerUtil.getPing(player)))) .replaceText(replace("%ladder%", ffa.getPlayers().get(player).getDisplayName())) .replaceText(replace("%arena%", ffa.getArena().getDisplayName())) .replaceText(replace("%kills%", String.valueOf(statistic.getKills()))) @@ -238,17 +234,12 @@ public static Component replaceMatchSpectatePlaceholders(Component line, Match m } // Handle match type specific placeholders - switch (match.getType()) { - case DUEL: - return handleSpectatorDuelPlaceholders(line, (Duel) match); - case PARTY_FFA: - return handleSpectatorPartyFFAPlaceholders(line, (PartyFFA) match); - case PARTY_SPLIT: - return handleSpectatorPartySplitPlaceholders(line, (PartySplit) match); - case PARTY_VS_PARTY: - return handleSpectatorPartyVsPartyPlaceholders(line, (PartyVsParty) match); - } - return line; + return switch (match.getType()) { + case DUEL -> handleSpectatorDuelPlaceholders(line, (Duel) match); + case PARTY_FFA -> handleSpectatorPartyFFAPlaceholders(line, (PartyFFA) match); + case PARTY_SPLIT -> handleSpectatorPartySplitPlaceholders(line, (PartySplit) match); + case PARTY_VS_PARTY -> handleSpectatorPartyVsPartyPlaceholders(line, (PartyVsParty) match); + }; } private static Component handleSpectatorDuelPlaceholders(Component line, Duel duel) { diff --git a/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/PracticeAdapter.java b/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/PracticeAdapter.java index 6685b669d..69f435d91 100644 --- a/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/PracticeAdapter.java +++ b/core/src/main/java/dev/nandi0813/practice/manager/sidebar/adapter/PracticeAdapter.java @@ -53,6 +53,10 @@ public class PracticeAdapter implements SidebarAdapter { + private static String fallbackToZero(String value) { + return value != null ? value : "0"; + } + @Override public Component getTitle(Player player) { return PAPIUtil.runThroughFormat(player, SidebarManager.getInstance().getConfig().getString("TITLE")); @@ -112,13 +116,15 @@ public List getLines(Player player) { ); } } else if (event != null) { - if (event.getQueueRunnable().getFormattedTime() != null) { + String eventQueueTimeLeft = event.getQueueRunnable() != null ? event.getQueueRunnable().getFormattedTime() : null; + + if (eventQueueTimeLeft != null) { for (String line : config.getStringList("LOBBY.EVENT-QUEUE.STARTING")) { sidebar.add(PAPIUtil.runThroughFormat(player, line) .replaceText(TextReplacementConfig.builder().match("%eventName%").replacement(event.getType().getName()).build()) .replaceText(TextReplacementConfig.builder().match("%maxPlayer%").replacement(String.valueOf(event.getType().getMaxPlayer())).build()) .replaceText(TextReplacementConfig.builder().match("%player%").replacement(String.valueOf(event.getPlayers().size())).build()) - .replaceText(TextReplacementConfig.builder().match("%timeLeft%").replacement(event.getQueueRunnable().getFormattedTime()).build()) + .replaceText(TextReplacementConfig.builder().match("%timeLeft%").replacement(fallbackToZero(eventQueueTimeLeft)).build()) .replaceText(TextReplacementConfig.builder().match("%division%").replacement(profile.getStats().getDivision() != null ? profile.getStats().getDivision().getComponentFullName() : Component.empty()).build()) .replaceText(TextReplacementConfig.builder().match("%division_short%").replacement(profile.getStats().getDivision() != null ? profile.getStats().getDivision().getComponentShortName() : Component.empty()).build()) ); diff --git a/core/src/main/java/dev/nandi0813/practice/module/VersionNotSupportedException.java b/core/src/main/java/dev/nandi0813/practice/module/VersionNotSupportedException.java deleted file mode 100644 index b01800420..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/VersionNotSupportedException.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.nandi0813.practice.module; - -import dev.nandi0813.practice.ZonePractice; -import org.bukkit.Bukkit; - -public class VersionNotSupportedException extends RuntimeException { - - public VersionNotSupportedException(Throwable err) { - super("Version is not supported! (" + Bukkit.getServer().getBukkitVersion() + ")", err); - ZonePractice.getInstance().onDisable(); - } - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ArenaUtil.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/ArenaUtil.java deleted file mode 100644 index bd64dd340..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ArenaUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import dev.nandi0813.practice.manager.arena.arenas.interfaces.BasicArena; -import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; -import org.bukkit.block.Block; -import org.bukkit.entity.ArmorStand; -import org.bukkit.inventory.ItemStack; - -public interface ArenaUtil { - - boolean turnsToDirt(Block block); - - boolean containsDestroyableBlock(Ladder ladder, Block block); - - /** - * Returns {@code true} if {@code block} requires a solid block directly below it to exist - * (e.g. dead bush, tall grass, sapling, flower, torch, etc.). - *

    - * These blocks are NOT included in the TNT {@code blockList} by Minecraft, yet they - * silently disappear when their support is destroyed by an explosion. We must track them - * manually before the explosion fires so the rollback can restore them. - */ - boolean requiresSupport(Block block); - - void loadArenaChunks(BasicArena arena); - - void setArmorStandItemInHand(ArmorStand armorStand, ItemStack item, boolean rightHand); - - void setArmorStandInvulnerable(ArmorStand armorStand); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/BedUtil.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/BedUtil.java deleted file mode 100644 index 51ff8cbcb..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/BedUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import dev.nandi0813.practice.manager.arena.util.BedLocation; -import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.fight.match.enums.TeamEnum; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.jetbrains.annotations.NotNull; - -public abstract class BedUtil implements Listener { - - public abstract boolean onBedBreak(final @NotNull BlockBreakEvent e, final @NotNull Match match); - - public abstract BedLocation getBedLocation(Block block); - - public abstract void placeBed(Location loc, BlockFace face); - - protected void sendBedDestroyMessage(Match match, TeamEnum team) { - String languagePath = switch (match.getLadder().getType()) { - case BEDWARS -> "MATCH." + match.getType().getPathName() + ".LADDER-SPECIFIC.BED-WARS"; - case FIREBALL_FIGHT -> "MATCH." + match.getType().getPathName() + ".LADDER-SPECIFIC.FIREBALL-FIGHT"; - default -> null; - }; - - if (languagePath == null) return; - - match.sendMessage(LanguageManager.getString(languagePath + ".BED-DESTROYED") - .replace("%team%", team.getNameMM()) - .replace("%teamColor%", team.getColorMM()) - , true); - } - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ChangedBlock.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/ChangedBlock.java deleted file mode 100644 index bfac373b0..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ChangedBlock.java +++ /dev/null @@ -1,57 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import lombok.Getter; -import lombok.Setter; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.inventory.ItemStack; - -public abstract class ChangedBlock { - - @Getter - public final Block block; - @Getter - public final Material material; - @Getter - public Location location; - - public ItemStack[] chestInventory; - @Setter - public BlockFace bedFace; - - protected ChangedBlock(final Block block) { - this.block = block; - this.location = block.getLocation(); - this.material = block.getType(); - - saveChest(this.location); - saveBed(this.location); - } - - /** - * Constructor for when the block has already changed in the world but we know its original material. - * Used for TNT blocks that became TNTPrimed entities before the explosion event fires. - */ - protected ChangedBlock(final Block block, final Material originalMaterial) { - this.block = block; - this.location = block.getLocation(); - this.material = originalMaterial; - // No chest/bed state to save — the block is already gone - } - - protected ChangedBlock(final BlockPlaceEvent e) { - this.block = e.getBlockPlaced(); - this.location = block.getLocation(); - this.material = e.getBlockReplacedState().getType(); - } - - protected abstract void saveChest(Location loc); - - protected abstract void saveBed(Location loc); - - public abstract void reset(); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ConfigItemProvider.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/ConfigItemProvider.java deleted file mode 100644 index fcdc9ad1a..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ConfigItemProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import dev.nandi0813.practice.manager.gui.GUIItem; -import org.bukkit.configuration.file.YamlConfiguration; - -/** - * Version-specific interface for loading GUIItems from configuration files. - * This abstraction handles differences between legacy (1.8) and modern (1.13+) item building. - */ -public interface ConfigItemProvider { - - /** - * Creates a GUIItem from a YAML configuration section. - * - * @param config The YAML configuration file - * @param loc The location path in the configuration (e.g., "ITEMS.EXAMPLE_ITEM") - * @return A fully configured GUIItem ready to be converted to an ItemStack - */ - GUIItem getGuiItem(YamlConfiguration config, String loc); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemCooldownHandler.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemCooldownHandler.java deleted file mode 100644 index bad64f83f..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemCooldownHandler.java +++ /dev/null @@ -1,101 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import dev.nandi0813.practice.manager.fight.util.FightPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; - -/** - * Version-specific strategy for handling item cooldowns on Ender Pearls, - * Golden Apples, and Firework Rockets. - * - *

    Legacy (1.8.8): blocks the action via {@link Cancellable#setCancelled(boolean)} - * and sends a chat message to the player. - * - *

    Modern (Paper): additionally calls {@code Player#setCooldown(Material, int)} so the item - * is visually grayed-out in the hotbar; no chat message is sent. - */ -public interface ItemCooldownHandler { - - /** - * Called when a player attempts to throw an ender pearl in an FFA. - * - * @param player the player - * @param fightPlayer the FFA fight-player context - * @param duration cooldown duration in seconds - * @param expBar whether to use the EXP bar to display the remaining time - * @param event the cancellable event - * @param langKey language key for the blocked-message (e.g. {@code "FFA.GAME.COOLDOWN.ENDER-PEARL"}) - */ - void handleEnderPearlFFA(Player player, FightPlayer fightPlayer, int duration, boolean expBar, - Cancellable event, String langKey); - - /** - * Called when a player attempts to throw an ender pearl in a match. - * - * @param player the player - * @param fightPlayer the match fight-player context - * @param duration cooldown duration in seconds - * @param expBar whether to use the EXP bar to display the remaining time - * @param event the cancellable event - * @param langKey language key for the blocked-message (e.g. {@code "MATCH.COOLDOWN.ENDER-PEARL"}) - */ - void handleEnderPearlMatch(Player player, FightPlayer fightPlayer, int duration, boolean expBar, - Cancellable event, String langKey); - - /** - * Called when a player attempts to consume a golden apple in an FFA. - * - * @param player the player - * @param duration cooldown duration in seconds - * @param event the cancellable event - * @param langKey language key for the blocked-message (e.g. {@code "FFA.GAME.COOLDOWN.GOLDEN-APPLE"}) - */ - void handleGoldenAppleFFA(Player player, int duration, Cancellable event, String langKey); - - /** - * Called when a player attempts to consume a golden apple in a match. - * - * @param player the player - * @param duration cooldown duration in seconds - * @param event the cancellable event - * @param langKey language key for the blocked-message (e.g. {@code "MATCH.COOLDOWN.GOLDEN-APPLE"}) - */ - void handleGoldenAppleMatch(Player player, int duration, Cancellable event, String langKey); - - /** - * Called when a player attempts to use a firework rocket in an FFA. - * - * @param player the player - * @param fightPlayer the FFA fight-player context - * @param duration cooldown duration in seconds - * @param event the cancellable event - * @param langKey language key for the blocked-message (e.g. {@code "MATCH.COOLDOWN.FIREWORK-ROCKET-COOLDOWN"}) - */ - void handleFireworkRocketFFA(Player player, FightPlayer fightPlayer, int duration, - Cancellable event, String langKey); - - /** - * Called when a player attempts to use a firework rocket in a match. - * - * @param player the player - * @param fightPlayer the match fight-player context - * @param duration cooldown duration in seconds - * @param event the cancellable event - * @param langKey language key for the blocked-message (e.g. {@code "MATCH.COOLDOWN.FIREWORK-ROCKET-COOLDOWN"}) - */ - void handleFireworkRocketMatch(Player player, FightPlayer fightPlayer, int duration, - Cancellable event, String langKey); - - /** - * Called when a player attempts to launch a fireball in a match (FireballFight ladder). - * - * @param player the player - * @param duration cooldown duration in seconds (double, as configured per-ladder) - * @param langKey language key for the blocked-message (e.g. {@code "MATCH.COOLDOWN.FIREBALL"}) - * @return {@code true} if the fireball should be launched (no cooldown active), - * {@code false} if the action was blocked because a cooldown is active - */ - boolean handleFireballMatch(Player player, double duration, String langKey); -} - - diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemCreateUtil.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemCreateUtil.java deleted file mode 100644 index 4e553b1b1..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemCreateUtil.java +++ /dev/null @@ -1,63 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import org.bukkit.Material; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.List; - -public abstract class ItemCreateUtil { - - public abstract ItemStack createItem(String displayname, Material material, Short damage, int amount, List lore); - - public abstract ItemStack createItem(String displayname, Material material); - - public abstract ItemStack createItem(Material material, Short damage); - - public abstract ItemStack createItem(String displayname, Material material, Short damage); - - public abstract ItemStack createItem(String displayname, Material material, List lore); - - public abstract ItemStack createItem(String displayname, Material material, Short damage, List lore); - - public abstract ItemStack createItem(ItemStack item, List lore); - - public abstract ItemStack createItem(ItemStack item, String name, List lore); - - public static void hideItemFlags(ItemMeta itemMeta) { - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - itemMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); - itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - itemMeta.addItemFlags(ItemFlag.HIDE_DESTROYS); - itemMeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); - itemMeta.addItemFlags(ItemFlag.HIDE_PLACED_ON); - } - - public static ItemStack hideItemFlags(ItemStack item) { - ItemMeta itemMeta = item.getItemMeta(); - hideItemFlags(itemMeta); - item.setItemMeta(itemMeta); - return item; - } - - public static short getDurabilityByColor(char c) { - return switch (c) { - case '0' -> Short.parseShort("15"); - case '1', '9' -> Short.parseShort("11"); - case '2' -> Short.parseShort("13"); - case '3' -> Short.parseShort("9"); - case '4', 'c' -> Short.parseShort("14"); - case '5' -> Short.parseShort("10"); - case '6' -> Short.parseShort("35"); - case '7' -> Short.parseShort("8"); - case '8' -> Short.parseShort("7"); - case 'a' -> Short.parseShort("5"); - case 'b' -> Short.parseShort("3"); - case 'd' -> Short.parseShort("6"); - case 'e' -> Short.parseShort("4"); - default -> 0; - }; - } - -} \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemMaterialUtil.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemMaterialUtil.java deleted file mode 100644 index d5e1cb70c..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/ItemMaterialUtil.java +++ /dev/null @@ -1,50 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; - -public interface ItemMaterialUtil { - - Material getSnowball(); - - Material getIronShovel(); - - Material getEyeOfEnder(); - - Material getRedBed(); - - Material getMushroomSoup(); - - Material getWater(); - - Material getLava(); - - Material getFireball(); - - Material getEndPortal(); - - Material getLilyPad(); - - Material getStainedClay(); - - Material getSplashPotion(); - - Material getGoldSword(); - - Material getClock(); - - EntityType getTNTMineCart(); - - ItemStack getPlayerHead(OfflinePlayer player); - - ItemStack getSword(); - - ItemStack getRedBlock(); - - ItemStack getDefaultPlayerHead(); - - ItemStack getRedBoots(); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/LadderUtil.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/LadderUtil.java deleted file mode 100644 index 82214f8f9..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/LadderUtil.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import dev.nandi0813.practice.manager.fight.match.Match; -import net.kyori.adventure.text.Component; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -public interface LadderUtil { - - void loadInventory(Player player, ItemStack[] armor, ItemStack[] inventory, ItemStack[] extra); - - ItemStack changeItemColor(ItemStack item, Component teamColor); - - ItemStack getPotionItem(String potion); - - boolean isUnbreakable(ItemStack item); - - ItemMeta setUnbreakable(ItemMeta item, boolean unbreakable); - - ItemStack setDurability(ItemStack itemStack, int durability); - - void placeTnt(BlockPlaceEvent e, Match match); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/PlayerHiderInterface.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/PlayerHiderInterface.java deleted file mode 100644 index 3407c1e89..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/PlayerHiderInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import org.bukkit.entity.Player; - -public interface PlayerHiderInterface { - - void hidePlayer(Player observer, Player target, boolean fullHide); - - void showPlayer(Player observer, Player target); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/PlayerUtil.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/PlayerUtil.java deleted file mode 100644 index 2434ba306..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/PlayerUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import dev.nandi0813.practice.manager.backend.ConfigManager; -import net.kyori.adventure.text.Component; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Fireball; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -public interface PlayerUtil { - - ItemStack getPlayerMainHand(Player player); - - boolean isItemInUse(Player player, Material material); - - ItemStack getItemInUse(Player player, Material material); - - void setItemInUseIf(Player player, Material material, ItemStack itemStack); - - List dropPlayerInventory(Player player); - - void clearInventory(Player player); - - void setCollidesWithEntities(Player player, boolean bool); - - int getPing(Player player); - - ItemStack[] getInventoryStorageContent(Player player); - - double getPlayerHealth(Player player); - - void setActiveInventoryTitle(Player player, String title); - - void setPlayerListName(Player player, Component component); - - Fireball shootFireball(Player player, double speed); - - double TNT_VELOCITY_HORIZONTAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.TNT.HORIZONTAL"); - double TNT_VELOCITY_VERTICAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.TNT.VERTICAL"); - double FB_VELOCITY_HORIZONTAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.FIREBALL.HORIZONTAL"); - double FB_VELOCITY_VERTICAL_MULTIPLICATIVE = ConfigManager.getDouble("MATCH-SETTINGS.FIREBALL-FIGHT.EXPLOSION.FIREBALL.VERTICAL"); - - void applyFireballKnockback(final Player player, final Fireball fireball); - - void applyTntKnockback(Player player, TNTPrimed tnt); - - /** - * Sets the player's attack speed based on hit delay. - * For 1.8.8: Does nothing (uses setMaximumNoDamageTicks only) - * For Modern (1.9+): Modifies GENERIC_ATTACK_SPEED attribute - * - * @param player The player - * @param hitDelay The hit delay in ticks (0 = instant, 20 = 1 second delay) - */ - void setAttackSpeed(Player player, int hitDelay); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/StatisticListener.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/StatisticListener.java deleted file mode 100644 index fbf4a73f2..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/StatisticListener.java +++ /dev/null @@ -1,87 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.sidebar.SidebarManager; -import lombok.Getter; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.PotionSplashEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public abstract class StatisticListener implements Listener { - - @Getter - protected final ZonePractice practice = ZonePractice.getInstance(); - @Getter - protected static final Map CURRENT_CPS = new ConcurrentHashMap<>(); - @Getter - protected static final Map CPS = new ConcurrentHashMap<>(); - @Getter - protected static final Map CURRENT_COMBO = new ConcurrentHashMap<>(); - - @EventHandler ( priority = EventPriority.LOWEST ) - public abstract void onClick(PlayerInteractEvent e); - - protected static @NotNull BukkitRunnable cpsRunnable(final Statistic statistic, Player player) { - return new BukkitRunnable() { - @Override - public void run() { - // Remove atomically — avoids the TOCTOU race between containsKey and get - // that can return null and cause an NPE when unboxing to int. - Integer current = CURRENT_CPS.remove(player); - if (current != null && current > 2) { - statistic.getCps().put(System.currentTimeMillis(), current); - CPS.put(player, current); - } - } - }; - } - - @EventHandler ( priority = EventPriority.LOWEST ) - public abstract void onPlayerHit(EntityDamageByEntityEvent e); - - protected static @NotNull BukkitRunnable hitRunnable(final Player attacker, final Statistic attackerStats, final Player defender, final Statistic defenderStats) { - return new BukkitRunnable() { - @Override - public void run() { - if (attackerStats != null) { - attackerStats.setHit(attackerStats.getHit() + 1); - - CURRENT_COMBO.putIfAbsent(attacker, 1); - CURRENT_COMBO.computeIfPresent(attacker, (key, val) -> val + 1); - } - - if (defenderStats != null) { - defenderStats.setGetHit(defenderStats.getGetHit() + 1); - - if (CURRENT_COMBO.containsKey(defender) && defenderStats.getLongestCombo() < CURRENT_COMBO.get(defender)) { - defenderStats.setLongestCombo(CURRENT_COMBO.get(defender)); - } - CURRENT_COMBO.put(defender, 0); - } - - // Immediately update scoreboards for real-time hit counter display - // Schedule on main thread since scoreboard updates must be on main thread - if (attacker != null && defender != null) { - ZonePractice.getInstance().getServer().getScheduler().runTask( - ZonePractice.getInstance(), - () -> SidebarManager.getInstance().updatePlayersSidebar(attacker, defender) - ); - } - } - }; - } - - @EventHandler ( priority = EventPriority.LOWEST ) - public abstract void onPotionSplash(PotionSplashEvent e); - -} \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/WorldCreate.java b/core/src/main/java/dev/nandi0813/practice/module/interfaces/WorldCreate.java deleted file mode 100644 index 54490aeea..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/WorldCreate.java +++ /dev/null @@ -1,9 +0,0 @@ -package dev.nandi0813.practice.module.interfaces; - -import org.bukkit.World; - -public interface WorldCreate { - - World createEmptyWorld(String worldName); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/util/ClassImport.java b/core/src/main/java/dev/nandi0813/practice/module/util/ClassImport.java deleted file mode 100644 index fc51f7baa..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/util/ClassImport.java +++ /dev/null @@ -1,139 +0,0 @@ -package dev.nandi0813.practice.module.util; - -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.module.VersionNotSupportedException; -import dev.nandi0813.practice.module.interfaces.ChangedBlock; -import dev.nandi0813.practice.module.interfaces.KitData; -import dev.nandi0813.practice.module.interfaces.actionbar.ActionBar; -import dev.nandi0813.practice.util.Common; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.event.block.BlockPlaceEvent; - -import java.lang.reflect.Constructor; -import java.util.Objects; - -public enum ClassImport { - ; - - private static Classes classes; - - public static Classes getClasses() { - if (classes == null) { - try { - Class c = getNamedClass(); - if (c != null && Classes.class.isAssignableFrom(c)) - classes = (Classes) c.getDeclaredConstructor().newInstance(); - } catch (final Exception e) { - throw new VersionNotSupportedException(e); - } - } - return classes; - } - - public static ChangedBlock createChangeBlock(Block block) { - if (block == null) return null; - - Class changedBlockClass = classes.getChangedBlockClass(); - if (ChangedBlock.class.isAssignableFrom(changedBlockClass)) { - try { - Constructor constructor = (Constructor) changedBlockClass.getConstructor(Block.class); - return constructor.newInstance(block); - } catch (Exception e) { - Common.sendConsoleMMMessage("Error: " + e.getMessage()); - } - } - return null; - } - - /** - * Creates a ChangedBlock for a position whose block has already changed (e.g. is now AIR) - * but whose original material is known. Used for TNT blocks that were chain-primed before - * the EntityExplodeEvent fires. - */ - public static ChangedBlock createChangeBlock(Block block, Material originalMaterial) { - if (block == null || originalMaterial == null) return null; - - Class changedBlockClass = classes.getChangedBlockClass(); - if (ChangedBlock.class.isAssignableFrom(changedBlockClass)) { - try { - Constructor constructor = (Constructor) changedBlockClass.getConstructor(Block.class, Material.class); - return constructor.newInstance(block, originalMaterial); - } catch (Exception e) { - Common.sendConsoleMMMessage("Error creating ChangedBlock with material override: " + e.getMessage()); - } - } - return null; - } - - public static ChangedBlock createChangeBlock(final BlockPlaceEvent blockPlaceEvent) { - if (blockPlaceEvent.getBlock().getLocation() == null) return null; - - Class changedBlockClass = classes.getChangedBlockClass(); - if (ChangedBlock.class.isAssignableFrom(changedBlockClass)) { - try { - Constructor constructor = (Constructor) changedBlockClass.getConstructor(BlockPlaceEvent.class); - return constructor.newInstance(blockPlaceEvent); - } catch (Exception e) { - Common.sendConsoleMMMessage("Error: " + e.getMessage()); - } - } - return null; - } - - public static KitData createKitData() { - Class kitDataClass = classes.getKitDataClass(); - if (KitData.class.isAssignableFrom(kitDataClass)) { - try { - Constructor constructor = (Constructor) kitDataClass.getConstructor(); - return constructor.newInstance(); - } catch (Exception e) { - Common.sendConsoleMMMessage("Error: " + e.getMessage()); - } - } - return null; - } - - public static KitData createKitData(KitData kitData) { - Class kitDataClass = classes.getKitDataClass(); - if (KitData.class.isAssignableFrom(kitDataClass)) { - try { - Constructor constructor = (Constructor) kitDataClass.getConstructor(KitData.class); - return constructor.newInstance(kitData); - } catch (Exception e) { - Common.sendConsoleMMMessage("Error: " + e.getMessage()); - } - } - return null; - } - - public static ActionBar createActionBarClass(Profile profile) { - Class actionBarClass = classes.getActionBarClass(); - if (ActionBar.class.isAssignableFrom(actionBarClass)) { - try { - Constructor constructor = (Constructor) actionBarClass.getConstructor(Profile.class); - return constructor.newInstance(profile); - } catch (Exception e) { - Common.sendConsoleMMMessage("Error: " + e.getMessage()); - } - } - return null; - } - - private static Class getNamedClass() { - - String version = Objects.requireNonNull(VersionChecker.getBukkitVersion()).getModuleVersionExtension(); - if (version == null) { - return null; - } - - try { - return Class.forName("dev.nandi0813.practice_" + version + "." + "Classes"); - } catch (final ClassNotFoundException e) { - Common.sendConsoleMMMessage("[ZonePractice] Class " + "Classes" + " cannot be found. Bukkit version: " + Bukkit.getServer().getBukkitVersion() + "."); - return null; - } - } - -} diff --git a/core/src/main/java/dev/nandi0813/practice/module/util/Classes.java b/core/src/main/java/dev/nandi0813/practice/module/util/Classes.java deleted file mode 100644 index 8a14b2a04..000000000 --- a/core/src/main/java/dev/nandi0813/practice/module/util/Classes.java +++ /dev/null @@ -1,39 +0,0 @@ -package dev.nandi0813.practice.module.util; - -import dev.nandi0813.practice.module.interfaces.*; - -public interface Classes { - - WorldCreate getWorldCreate(); - - PlayerHiderInterface getPlayerHiderUtil(); - - ItemMaterialUtil getItemMaterialUtil(); - - LadderUtil getLadderUtil(); - - ItemCreateUtil getItemCreateUtil(); - - PlayerUtil getPlayerUtil(); - - ArenaUtil getArenaUtil(); - - BedUtil getBedUtil(); - - Class getChangedBlockClass(); - - EntityHider getEntityHider(); - - ArenaCopyUtil getArenaCopyUtil(); - - ConfigItemProvider getConfigItemProvider(); - - AbstractBuildListener getBuildListener(); - - Class getKitDataClass(); - - Class getActionBarClass(); - - ItemCooldownHandler getItemCooldownHandler(); - -} diff --git a/core/src/main/java/dev/nandi0813/practice/util/Common.java b/core/src/main/java/dev/nandi0813/practice/util/Common.java index bd5181389..caa27cc7e 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/Common.java +++ b/core/src/main/java/dev/nandi0813/practice/util/Common.java @@ -1,37 +1,31 @@ package dev.nandi0813.practice.util; import dev.nandi0813.practice.ZonePractice; +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; import me.clip.placeholderapi.PlaceholderAPI; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; import java.util.ArrayList; import java.util.List; +import java.util.Locale; +import java.util.Map; public enum Common { ; public static void send(CommandSender sender, Component component) { if (sender == null) return; - - try { - sender.getClass().getMethod("sendMessage", Component.class).invoke(sender, component); - return; - } catch (Throwable ignored) { } - - if (sender instanceof Player p) { - try { - p.spigot().sendMessage(BungeeComponentSerializer.get().serialize(component)); - return; - } catch (Throwable ignored) { } - } - - String legacy = LegacyComponentSerializer.legacySection().serialize(component); - sender.sendMessage(legacy.isEmpty() ? " " : legacy); + sender.sendMessage(component); } public static void sendMMMessage(Player player, String line) { @@ -81,8 +75,22 @@ public static String serializeNormalToMMString(String normalString) { } public static String colorize(String message) { - if (message == null) return ""; - return ChatColor.translateAlternateColorCodes('&', message); + return StringUtil.CC(message); + } + + public static Component legacyToComponent(String message) { + if (message == null) { + return Component.empty(); + } + return LegacyComponentSerializer.legacyAmpersand().deserialize(message); + } + + public static String stripLegacyColor(String message) { + if (message == null || message.isEmpty()) { + return ""; + } + Component component = LegacyComponentSerializer.legacyAmpersand().deserialize(message); + return PlainTextComponentSerializer.plainText().serialize(component); } public static List mmToNormal(List list) { @@ -92,4 +100,87 @@ public static List mmToNormal(List list) { } return newList; } + + public static String getItemDisplayName(ItemMeta itemMeta) { + if (itemMeta == null || !itemMeta.hasDisplayName() || itemMeta.displayName() == null) { + return ""; + } + return serializeComponentToLegacyString(itemMeta.displayName()); + } + + public static String getItemDisplayName(ItemStack itemStack) { + if (itemStack == null || !itemStack.hasItemMeta()) { + return ""; + } + return getItemDisplayName(itemStack.getItemMeta()); + } + + public static short getItemDamage(ItemStack itemStack) { + if (itemStack == null || !itemStack.hasItemMeta()) { + return 0; + } + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta instanceof Damageable damageable) { + return (short) damageable.getDamage(); + } + return 0; + } + + private static final Map LEGACY_ENCHANTMENT_ALIASES = Map.ofEntries( + Map.entry("DAMAGE_ALL", "sharpness"), + Map.entry("DAMAGE_UNDEAD", "smite"), + Map.entry("DAMAGE_ARTHROPODS", "bane_of_arthropods"), + Map.entry("ARROW_DAMAGE", "power"), + Map.entry("ARROW_KNOCKBACK", "punch"), + Map.entry("ARROW_FIRE", "flame"), + Map.entry("ARROW_INFINITE", "infinity"), + Map.entry("DIG_SPEED", "efficiency"), + Map.entry("DURABILITY", "unbreaking"), + Map.entry("LOOT_BONUS_BLOCKS", "fortune"), + Map.entry("LOOT_BONUS_MOBS", "looting"), + Map.entry("OXYGEN", "respiration"), + Map.entry("PROTECTION_ENVIRONMENTAL", "protection"), + Map.entry("PROTECTION_FIRE", "fire_protection"), + Map.entry("PROTECTION_FALL", "feather_falling"), + Map.entry("PROTECTION_EXPLOSIONS", "blast_protection"), + Map.entry("PROTECTION_PROJECTILE", "projectile_protection"), + Map.entry("WATER_WORKER", "aqua_affinity"), + Map.entry("THORNS", "thorns"), + Map.entry("KNOCKBACK", "knockback"), + Map.entry("FIRE_ASPECT", "fire_aspect"), + Map.entry("SILK_TOUCH", "silk_touch") + ); + + public static Iterable getAllEnchantments() { + return RegistryAccess.registryAccess().getRegistry(RegistryKey.ENCHANTMENT); + } + + public static Enchantment resolveEnchantment(String enchantmentName) { + if (enchantmentName == null || enchantmentName.isBlank()) { + return null; + } + + String normalized = enchantmentName.trim().toLowerCase(Locale.ROOT).replace("minecraft:", ""); + Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(normalized)); + if (enchantment != null) { + return enchantment; + } + + String mapped = LEGACY_ENCHANTMENT_ALIASES.get(enchantmentName.trim().toUpperCase(Locale.ROOT)); + if (mapped != null) { + enchantment = Enchantment.getByKey(NamespacedKey.minecraft(mapped)); + if (enchantment != null) { + return enchantment; + } + } + + for (Enchantment value : getAllEnchantments()) { + String key = value.getKey().getKey(); + if (key.equalsIgnoreCase(enchantmentName) + || key.equalsIgnoreCase(normalized)) { + return value; + } + } + return null; + } } \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/util/Cuboid.java b/core/src/main/java/dev/nandi0813/practice/util/Cuboid.java index 08a67eb95..7b42857d0 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/Cuboid.java +++ b/core/src/main/java/dev/nandi0813/practice/util/Cuboid.java @@ -402,96 +402,6 @@ public byte getAverageLightLevel() { return n > 0 ? (byte) (total / n) : 0; } - /** - * Contract the Cuboid, returning a Cuboid with any air around the edges removed, just large enough to include all non-air blocks. - * - * @return A new Cuboid with no external air blocks - */ - public Cuboid contract() { - return this.contract(CuboidDirection.Down).contract(CuboidDirection.South).contract(CuboidDirection.East).contract(CuboidDirection.Up).contract(CuboidDirection.North).contract(CuboidDirection.West); - } - - /** - * Contract the Cuboid in the given direction, returning a new Cuboid which has no exterior empty space. - * E.g. A direction of Down will push the top face downwards as much as possible. - * - * @param dir - The direction in which to contract - * @return A new Cuboid contracted in the given direction - */ - public Cuboid contract(CuboidDirection dir) { - Cuboid face = getFace(dir.opposite()); - return switch (dir) { - case Down -> { - while (face.containsOnly(0) && face.getLowerY() > this.getLowerY()) { - face = face.shift(CuboidDirection.Down, 1); - } - yield new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, face.getUpperY(), this.z2); - } - case Up -> { - while (face.containsOnly(0) && face.getUpperY() < this.getUpperY()) { - face = face.shift(CuboidDirection.Up, 1); - } - yield new Cuboid(this.worldName, this.x1, face.getLowerY(), this.z1, this.x2, this.y2, this.z2); - } - case North -> { - while (face.containsOnly(0) && face.getLowerX() > this.getLowerX()) { - face = face.shift(CuboidDirection.North, 1); - } - yield new Cuboid(this.worldName, this.x1, this.y1, this.z1, face.getUpperX(), this.y2, this.z2); - } - case South -> { - while (face.containsOnly(0) && face.getUpperX() < this.getUpperX()) { - face = face.shift(CuboidDirection.South, 1); - } - yield new Cuboid(this.worldName, face.getLowerX(), this.y1, this.z1, this.x2, this.y2, this.z2); - } - case East -> { - while (face.containsOnly(0) && face.getLowerZ() > this.getLowerZ()) { - face = face.shift(CuboidDirection.East, 1); - } - yield new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, face.getUpperZ()); - } - case West -> { - while (face.containsOnly(0) && face.getUpperZ() < this.getUpperZ()) { - face = face.shift(CuboidDirection.West, 1); - } - yield new Cuboid(this.worldName, this.x1, this.y1, face.getLowerZ(), this.x2, this.y2, this.z2); - } - default -> throw new IllegalArgumentException("Invalid direction " + dir); - }; - } - - /** - * Get the Cuboid representing the face of this Cuboid. The resulting Cuboid will be one block thick in the axis perpendicular to the requested face. - * - * @param dir - which face of the Cuboid to get - * @return The Cuboid representing this Cuboid's requested face - */ - public Cuboid getFace(CuboidDirection dir) { - return switch (dir) { - case Down -> new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y1, this.z2); - case Up -> new Cuboid(this.worldName, this.x1, this.y2, this.z1, this.x2, this.y2, this.z2); - case North -> new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x1, this.y2, this.z2); - case South -> new Cuboid(this.worldName, this.x2, this.y1, this.z1, this.x2, this.y2, this.z2); - case East -> new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, this.z1); - case West -> new Cuboid(this.worldName, this.x1, this.y1, this.z2, this.x2, this.y2, this.z2); - default -> throw new IllegalArgumentException("Invalid direction " + dir); - }; - } - - /** - * Check if the Cuboid contains only blocks of the given type - * - * @param blockId - The block ID to check for - * @return true if this Cuboid contains only blocks of the given type - */ - public boolean containsOnly(int blockId) { - for (Block b : this) { - if (b.getTypeId() != blockId) return false; - } - return true; - } - /** * Get the Cuboid big enough to hold both this Cuboid and the given one. * diff --git a/core/src/main/java/dev/nandi0813/practice/util/GoldenHead.java b/core/src/main/java/dev/nandi0813/practice/util/GoldenHead.java index 73730c314..e99e049b2 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/GoldenHead.java +++ b/core/src/main/java/dev/nandi0813/practice/util/GoldenHead.java @@ -5,6 +5,8 @@ import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -40,7 +42,10 @@ public void getEffects() { String[] split = effect.split("::"); if (split.length != 3) continue; - PotionEffectType type = PotionEffectType.getByName(split[0]); + PotionEffectType type = Registry.EFFECT.get(NamespacedKey.minecraft(split[0].toLowerCase())); + if (type == null) { + type = Registry.EFFECT.get(NamespacedKey.minecraft(split[0].replace(' ', '_').toLowerCase())); + } if (type == null) continue; if (StringUtil.isNotInteger(split[1])) continue; @@ -80,7 +85,7 @@ public void onGoldenHeadConsume(PlayerInteractEvent e) { int amount = item.getAmount(); if (amount == 1) - player.setItemInHand(null); + player.getInventory().setItemInMainHand(null); else item.setAmount(amount - 1); @@ -101,7 +106,7 @@ public void onGoldenHeadConsume(PlayerInteractEvent e) { } if (activate) - player.addPotionEffect(effect, true); + player.addPotionEffect(effect); } player.updateInventory(); diff --git a/core/src/main/java/dev/nandi0813/practice/util/ItemCreateUtil.java b/core/src/main/java/dev/nandi0813/practice/util/ItemCreateUtil.java new file mode 100644 index 000000000..362769666 --- /dev/null +++ b/core/src/main/java/dev/nandi0813/practice/util/ItemCreateUtil.java @@ -0,0 +1,174 @@ +package dev.nandi0813.practice.util; + +import net.kyori.adventure.text.Component; +import org.bukkit.Color; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.List; +import java.util.stream.Collectors; + +public class ItemCreateUtil { + + public static ItemStack createItem(String displayname, Material material, Short damage, int amount, List lore) { + ItemStack itemStack = new ItemStack(material, amount); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + itemMeta.displayName(Component.text(StringUtil.CC(displayname))); + itemMeta.lore(StringUtil.CC(lore).stream().map(Component::text).collect(Collectors.toList())); + + if (itemMeta instanceof Damageable) + ((Damageable) itemMeta).setDamage(damage); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static ItemStack createItem(String displayname, Material material) { + ItemStack itemStack = new ItemStack(material); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + itemMeta.displayName(Component.text(StringUtil.CC(displayname))); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static ItemStack createItem(Material material, Short damage) { + ItemStack itemStack = new ItemStack(material); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + if (itemMeta instanceof Damageable) + ((Damageable) itemMeta).setDamage(damage); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static ItemStack createItem(String displayname, Material material, Short damage) { + ItemStack itemStack = new ItemStack(material); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + itemMeta.displayName(Component.text(StringUtil.CC(displayname))); + + if (itemMeta instanceof Damageable) + ((Damageable) itemMeta).setDamage(damage); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static ItemStack createItem(String displayname, Material material, List lore) { + ItemStack itemStack = new ItemStack(material); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + itemMeta.displayName(Component.text(StringUtil.CC(displayname))); + itemMeta.lore(StringUtil.CC(lore).stream().map(Component::text).collect(Collectors.toList())); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static ItemStack createItem(String displayname, Material material, Short damage, List lore) { + ItemStack itemStack = new ItemStack(material); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + itemMeta.displayName(Component.text(StringUtil.CC(displayname))); + itemMeta.lore(StringUtil.CC(lore).stream().map(Component::text).collect(Collectors.toList())); + + if (itemMeta instanceof Damageable) + ((Damageable) itemMeta).setDamage(damage); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static ItemStack createItem(ItemStack item, List lore) { + ItemStack itemStack = new ItemStack(item); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + itemMeta.lore(StringUtil.CC(lore).stream().map(Component::text).collect(Collectors.toList())); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static ItemStack createItem(ItemStack item, String name, List lore) { + ItemStack itemStack = new ItemStack(item); + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + itemMeta.displayName(Component.text(StringUtil.CC(name))); + itemMeta.lore(StringUtil.CC(lore).stream().map(Component::text).collect(Collectors.toList())); + + hideItemFlags(itemMeta); + itemStack.setItemMeta(itemMeta); + } + return itemStack; + } + + public static void hideItemFlags(ItemMeta itemMeta) { + itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + itemMeta.addItemFlags(ItemFlag.HIDE_DESTROYS); + itemMeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + itemMeta.addItemFlags(ItemFlag.HIDE_PLACED_ON); + itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + itemMeta.addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP); + } + + public static ItemStack hideItemFlags(ItemStack item) { + ItemMeta itemMeta = item.getItemMeta(); + hideItemFlags(itemMeta); + item.setItemMeta(itemMeta); + return item; + } + + public static ItemStack getPlayerHead(OfflinePlayer player) { + ItemStack item = new ItemStack(Material.PLAYER_HEAD); + SkullMeta meta = (SkullMeta) item.getItemMeta(); + if (meta != null) + meta.setOwningPlayer(player); + item.setItemMeta(meta); + + return item; + } + + public static ItemStack getRedBoots() { + ItemStack boots = new ItemStack(Material.LEATHER_BOOTS); + LeatherArmorMeta meta = (LeatherArmorMeta) boots.getItemMeta(); + if (meta != null) { + meta.setColor(Color.RED); + boots.setItemMeta(meta); + } + return boots; + } + +} \ No newline at end of file diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/KitData.java b/core/src/main/java/dev/nandi0813/practice/util/KitData.java similarity index 72% rename from core/src/main/java/dev/nandi0813/practice/module/interfaces/KitData.java rename to core/src/main/java/dev/nandi0813/practice/util/KitData.java index 6f49eeaef..0f00c7378 100644 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/KitData.java +++ b/core/src/main/java/dev/nandi0813/practice/util/KitData.java @@ -1,6 +1,5 @@ -package dev.nandi0813.practice.module.interfaces; +package dev.nandi0813.practice.util; -import dev.nandi0813.practice.util.ItemSerializationUtil; import lombok.Getter; import lombok.Setter; import org.bukkit.configuration.file.FileConfiguration; @@ -9,10 +8,11 @@ import org.bukkit.potion.PotionEffect; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @Getter -public abstract class KitData { +public class KitData { protected ItemStack[] storage; protected ItemStack[] armor; @@ -66,8 +66,19 @@ public void getData(final FileConfiguration config, final String map) { this.armor = ItemSerializationUtil.itemStackArrayFromBase64(config.getString(armorPath)); if (config.isString(extraPath)) this.extra = ItemSerializationUtil.itemStackArrayFromBase64(config.getString(extraPath)); - if (config.isSet(effectsPath)) - this.effects = (List) config.get(effectsPath); + if (config.isSet(effectsPath)) { + this.effects = new ArrayList<>(); + Object rawEffects = config.get(effectsPath); + if (rawEffects instanceof List list) { + for (Object entry : list) { + if (entry instanceof PotionEffect potionEffect) { + this.effects.add(potionEffect); + } + } + } else if (rawEffects instanceof PotionEffect[] array) { + this.effects.addAll(Arrays.asList(array)); + } + } } public void setKitData(final Player player, final boolean setEffect) { @@ -104,28 +115,40 @@ public void loadKitData(final Player player, final boolean clearActiveEffects) { player.updateInventory(); } - public void setStorage(ItemStack[] storage) { - this.storage = storage; + public void setStorage(Player player) { + this.storage = player.getInventory().getStorageContents().clone(); } - public void setArmor(ItemStack[] armor) { - this.armor = armor; + public void setArmor(Player player) { + this.armor = player.getInventory().getArmorContents().clone(); } - public void setExtra(ItemStack[] extra) { - this.extra = extra; + public void setExtra(Player player) { + this.extra = player.getInventory().getExtraContents().clone(); } - public abstract void setStorage(Player player); + public void setStorage(ItemStack[] storage) { + this.storage = storage.clone(); + } - public abstract void setArmor(Player player); + public void setArmor(ItemStack[] armor) { + this.armor = armor.clone(); + } - public abstract void setExtra(Player player); + public void setExtra(ItemStack[] extra) { + this.extra = extra.clone(); + } - public abstract void loadStorage(Player player); + public void loadStorage(Player player) { + player.getInventory().setContents(this.storage.clone()); + } - public abstract void loadArmor(Player player); + public void loadArmor(Player player) { + player.getInventory().setArmorContents(this.armor.clone()); + } - public abstract void loadExtra(Player player); + public void loadExtra(Player player) { + player.getInventory().setExtraContents(this.extra.clone()); + } } diff --git a/core/src/main/java/dev/nandi0813/practice/util/SaveResource.java b/core/src/main/java/dev/nandi0813/practice/util/SaveResource.java index d55e4c15d..c63214418 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/SaveResource.java +++ b/core/src/main/java/dev/nandi0813/practice/util/SaveResource.java @@ -7,19 +7,26 @@ import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.module.util.VersionChecker; -import org.apache.commons.io.FileUtils; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.Objects; public class SaveResource { - // Ladders common to all versions - private static final String[] COMMON_LADDER_NAMES = { + private static final String[] ROOT_FILES = { + "language.yml", + "sidebar.yml", + "groups.yml", + "config.yml", + "divisions.yml", + "guis.yml", + "inventories.yml", + "playerkit.yml" + }; + + private static final String[] LADDER_FILES = { "archer.yml", "axe.yml", "battlerush.yml", @@ -27,104 +34,36 @@ public class SaveResource { "boxing.yml", "bridges.yml", "builduhc.yml", + "crystal.yml", "debuff.yml", "fireball.yml", "gapple.yml", + "mace.yml", "nodebuff.yml", "pearlfight.yml", "sg.yml", "skywars.yml", "soup.yml", + "spear.yml", "spleef.yml", "sumo.yml", "vanilla.yml" }; - // Ladders exclusive to 1.8.8 - private static final String[] LEGACY_ONLY_LADDER_NAMES = { - "combo.yml" - }; - - // Ladders exclusive to modern versions (1.20+) - private static final String[] MODERN_ONLY_LADDER_NAMES = { - "mace.yml", - "crystal.yml", - "spear.yml" - }; - - /** - * Gets the appropriate ladder list for the current server version - * - * @return Array of ladder file names to save - */ - private String[] getLadderNames() { - VersionChecker.BukkitVersion version = VersionChecker.getBukkitVersion(); - if (version == null) { - Common.sendConsoleMMMessage("Could not detect version, using common ladders only."); - return COMMON_LADDER_NAMES; - } - - // Combine common ladders with version-specific ones - if (version == VersionChecker.BukkitVersion.v1_8_R3) { - // 1.8.8: Common + Legacy-only - return combineArrays(COMMON_LADDER_NAMES, LEGACY_ONLY_LADDER_NAMES); - } else { - // Modern versions: Common + Modern-only - return combineArrays(COMMON_LADDER_NAMES, MODERN_ONLY_LADDER_NAMES); - } - } - - /** - * Combines two string arrays into one - */ - private String[] combineArrays(String[] array1, String[] array2) { - String[] result = new String[array1.length + array2.length]; - System.arraycopy(array1, 0, result, 0, array1.length); - System.arraycopy(array2, 0, result, array1.length, array2.length); - return result; - } - public void saveResources(ZonePractice practice) { - saveResource( - new File(practice.getDataFolder(), "language.yml"), - practice.getResource("language.yml")); - saveResource( - new File(practice.getDataFolder(), "sidebar.yml"), - practice.getResource("sidebar.yml")); - saveResource( - new File(practice.getDataFolder(), "groups.yml"), - practice.getResource("groups.yml")); - saveResource( - new File(practice.getDataFolder(), "config.yml"), - practice.getResource(this.getVersionPath() + "config.yml")); - saveResource( - new File(practice.getDataFolder(), "divisions.yml"), - practice.getResource(this.getVersionPath() + "divisions.yml")); - saveResource( - new File(practice.getDataFolder(), "guis.yml"), - practice.getResource(this.getVersionPath() + "guis.yml")); - saveResource( - new File(practice.getDataFolder(), "inventories.yml"), - practice.getResource(this.getVersionPath() + "inventories.yml")); - saveResource( - new File(practice.getDataFolder(), "playerkit.yml"), - practice.getResource(this.getVersionPath() + "playerkit.yml")); - - File ladderFolder = new File(practice.getDataFolder(), "/ladders"); - if (!ladderFolder.exists()) { - if (!ladderFolder.mkdir()) { - Common.sendConsoleMMMessage("Couldn't create ladders folder."); - } - - // Use version-specific ladder list - for (String ladder : getLadderNames()) { - saveLadder(practice, this.getVersionPath(), ladder); + for (String fileName : ROOT_FILES) { + InputStream resource = practice.getResource(fileName); + if (resource == null) { + Common.sendConsoleMMMessage("Missing bundled resource: " + fileName); + continue; } + saveResource(new File(practice.getDataFolder(), fileName), resource); + } - try { - FileUtils.deleteDirectory(new File(practice.getDataFolder(), this.getVersionPath().replace("/", ""))); - } catch (IOException e) { - throw new RuntimeException(e); + File ladderFolder = new File(practice.getDataFolder(), "ladders"); + if (!ladderFolder.exists()) { + for (String fileName : LADDER_FILES) { + practice.saveResource("ladders/" + fileName, false); } } } @@ -132,29 +71,13 @@ public void saveResources(ZonePractice practice) { private void saveResource(@NotNull File document, @NotNull InputStream defaults) { try { YamlDocument.create(document, defaults, - GeneralSettings.DEFAULT, LoaderSettings.builder().setAutoUpdate(true).build(), - DumperSettings.DEFAULT, UpdaterSettings.builder().setVersioning(new BasicVersioning("VERSION")).build()); - + GeneralSettings.DEFAULT, + LoaderSettings.builder().setAutoUpdate(true).build(), + DumperSettings.DEFAULT, + UpdaterSettings.builder().setVersioning(new BasicVersioning("VERSION")).build()); } catch (IOException e) { Common.sendConsoleMMMessage("Couldn't load " + document.getName() + "."); } } - private String getVersionPath() { - return Objects.requireNonNull(VersionChecker.getBukkitVersion()).getFilePath(); - } - - private static void saveLadder(ZonePractice practice, String path, String fileName) { - practice.saveResource(path + "ladders/" + fileName, false); - File file = getFile(path + "ladders/" + fileName); - if (file.exists()) { - if (!file.renameTo(new File(practice.getDataFolder() + "/ladders/", fileName))) - Common.sendConsoleMMMessage("Couldn't move " + fileName + " to ladders folder."); - } - } - - private static File getFile(String path) { - return new File(ZonePractice.getInstance().getDataFolder(), path); - } - } diff --git a/core/src/main/java/dev/nandi0813/practice/util/StringUtil.java b/core/src/main/java/dev/nandi0813/practice/util/StringUtil.java index 4f139d71b..d2d74a60c 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/StringUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/util/StringUtil.java @@ -1,9 +1,8 @@ package dev.nandi0813.practice.util; import dev.nandi0813.practice.manager.backend.LanguageManager; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.commons.lang3.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.Color; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -14,7 +13,10 @@ public enum StringUtil { ; public static String CC(String string) { - return ChatColor.translateAlternateColorCodes('&', string); + if (string == null) { + return ""; + } + return LegacyComponentSerializer.legacySection().serialize(LegacyComponentSerializer.legacyAmpersand().deserialize(string)); } public static List CC(List stringlist) { @@ -69,27 +71,6 @@ public static String getNormalizedName(String name) { return StringUtils.capitalize(name.replace("_", " ").toLowerCase()); } - public static Color translateChatColorToColor(ChatColor chatColor) { - return switch (chatColor) { - case AQUA -> Color.AQUA; - case BLACK -> Color.BLACK; - case BLUE -> Color.BLUE; - case DARK_AQUA -> Color.TEAL; - case DARK_BLUE -> Color.NAVY; - case DARK_GRAY -> Color.GRAY; - case DARK_GREEN -> Color.GREEN; - case DARK_PURPLE -> Color.PURPLE; - case DARK_RED -> Color.MAROON; - case GOLD -> Color.ORANGE; - case GRAY -> Color.SILVER; - case GREEN -> Color.OLIVE; - case LIGHT_PURPLE -> Color.FUCHSIA; - case RED -> Color.RED; - case WHITE -> Color.WHITE; - case YELLOW -> Color.YELLOW; - default -> null; - }; - } public static String legacyColorToMiniMessage(String string) { return string diff --git a/core/src/main/java/dev/nandi0813/practice/module/util/VersionChecker.java b/core/src/main/java/dev/nandi0813/practice/util/VersionChecker.java similarity index 66% rename from core/src/main/java/dev/nandi0813/practice/module/util/VersionChecker.java rename to core/src/main/java/dev/nandi0813/practice/util/VersionChecker.java index f35fe9399..fdfab2c0d 100644 --- a/core/src/main/java/dev/nandi0813/practice/module/util/VersionChecker.java +++ b/core/src/main/java/dev/nandi0813/practice/util/VersionChecker.java @@ -1,5 +1,6 @@ -package dev.nandi0813.practice.module.util; +package dev.nandi0813.practice.util; +import dev.nandi0813.practice.ZonePractice; import lombok.Getter; import org.bukkit.Bukkit; @@ -30,20 +31,18 @@ public static BukkitVersion getBukkitVersion() { final String mcVersion = extractMcVersion(versionString); if (mcVersion == null) { - Bukkit.getLogger().warning("Could not extract MC version from: " + versionString); + ZonePractice.getInstance().getLogger().warning("Could not extract MC version from: " + versionString); bukkitVersion = null; return null; } - if (mcVersion.startsWith("1.8")) - bukkitVersion = BukkitVersion.v1_8_R3; - else if (mcVersion.equals("1.20.6")) + if (mcVersion.equals("1.20.6")) bukkitVersion = BukkitVersion.v1_20_R4; else if (mcVersion.startsWith("1.21")) bukkitVersion = BukkitVersion.v1_21_R3; else { // Unknown version - keep null but log for visibility - Bukkit.getLogger().warning("Unsupported MC version: " + mcVersion); + ZonePractice.getInstance().getLogger().warning("Unsupported MC version: " + mcVersion); bukkitVersion = null; } } @@ -61,19 +60,8 @@ private static String extractMcVersion(final String bukkitVersionString) { @Getter public enum BukkitVersion { - v1_8_R3("1_8_8", "1.8.8/", false), // 1.8.8 - v1_20_R4("modern", "modern/", true), // 1.20.6 - v1_21_R3("modern", "modern/", true); // 1.21.4 - - private final String moduleVersionExtension; - private final String filePath; - private final boolean secondHand; - - BukkitVersion(final String moduleVersionExtension, final String filePath, final boolean secondHand) { - this.moduleVersionExtension = moduleVersionExtension; - this.filePath = filePath; - this.secondHand = secondHand; - } + v1_20_R4, // 1.20.6 + v1_21_R3 // 1.21.X } } diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/actionbar/ActionBar.java b/core/src/main/java/dev/nandi0813/practice/util/actionbar/ActionBar.java similarity index 83% rename from core/src/main/java/dev/nandi0813/practice/module/interfaces/actionbar/ActionBar.java rename to core/src/main/java/dev/nandi0813/practice/util/actionbar/ActionBar.java index c3a4e763d..22f307870 100644 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/actionbar/ActionBar.java +++ b/core/src/main/java/dev/nandi0813/practice/util/actionbar/ActionBar.java @@ -1,13 +1,14 @@ -package dev.nandi0813.practice.module.interfaces.actionbar; +package dev.nandi0813.practice.util.actionbar; import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.profile.Profile; import lombok.Getter; import lombok.Setter; import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; @Getter -public abstract class ActionBar { +public class ActionBar { protected final Profile profile; @@ -22,9 +23,19 @@ public ActionBar(final Profile profile) { this.lock = false; } - protected abstract void send(); + public void send() { + Player player = profile.getPlayer().getPlayer(); + if (player != null) { + player.sendActionBar(this.message); + } + } - protected abstract void clear(); + public void clear() { + Player player = profile.getPlayer().getPlayer(); + if (player != null) { + player.sendActionBar(Component.empty()); + } + } /** * Only use it for constant messages diff --git a/core/src/main/java/dev/nandi0813/practice/module/interfaces/actionbar/ActionBarRunnable.java b/core/src/main/java/dev/nandi0813/practice/util/actionbar/ActionBarRunnable.java similarity index 91% rename from core/src/main/java/dev/nandi0813/practice/module/interfaces/actionbar/ActionBarRunnable.java rename to core/src/main/java/dev/nandi0813/practice/util/actionbar/ActionBarRunnable.java index 84afd533b..489fe15bf 100644 --- a/core/src/main/java/dev/nandi0813/practice/module/interfaces/actionbar/ActionBarRunnable.java +++ b/core/src/main/java/dev/nandi0813/practice/util/actionbar/ActionBarRunnable.java @@ -1,4 +1,4 @@ -package dev.nandi0813.practice.module.interfaces.actionbar; +package dev.nandi0813.practice.util.actionbar; import dev.nandi0813.practice.util.interfaces.Runnable; diff --git a/core/src/main/java/dev/nandi0813/practice/util/entityhider/PlayerHider.java b/core/src/main/java/dev/nandi0813/practice/util/entityhider/PlayerHider.java index 0c42306e3..39691d4b3 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/entityhider/PlayerHider.java +++ b/core/src/main/java/dev/nandi0813/practice/util/entityhider/PlayerHider.java @@ -1,5 +1,7 @@ package dev.nandi0813.practice.util.entityhider; +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerInfoUpdate; import dev.nandi0813.api.Event.Spectate.Start.MatchSpectateStartEvent; import dev.nandi0813.practice.ZonePractice; import dev.nandi0813.practice.manager.backend.LanguageManager; @@ -10,7 +12,6 @@ import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; import dev.nandi0813.practice.manager.server.ServerManager; import dev.nandi0813.practice.manager.server.WorldEnum; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -157,7 +158,7 @@ public void onSpectatingStart(MatchSpectateStartEvent e) { public void toggleLobbyVisibility(Player player) { Profile profile = ProfileManager.getInstance().getProfile(player); - if (ServerManager.getInstance().getInWorld().get(player).equals(WorldEnum.LOBBY)) + if (!ServerManager.getInstance().getInWorld().get(player).equals(WorldEnum.LOBBY)) return; for (Player online : ServerManager.getInstance().getInWorld().keySet()) { @@ -241,11 +242,21 @@ public void toggleStaffVisibility(Player player) { public void hidePlayer(Player observer, Player target, boolean fullHide) { - ClassImport.getClasses().getPlayerHiderUtil().hidePlayer(observer, target, fullHide); + if (observer.canSee(target)) + observer.hidePlayer(ZonePractice.getInstance(), target); + + if (!fullHide) { + WrapperPlayServerPlayerInfoUpdate playerInfoUpdate = new WrapperPlayServerPlayerInfoUpdate( + WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_LISTED, + new WrapperPlayServerPlayerInfoUpdate.PlayerInfo(target.getUniqueId()) + ); + + PacketEvents.getAPI().getPlayerManager().sendPacket(observer, playerInfoUpdate); + } } public void showPlayer(Player observer, Player target) { - ClassImport.getClasses().getPlayerHiderUtil().showPlayer(observer, target); + observer.showPlayer(ZonePractice.getInstance(), target); } /* diff --git a/core/src/main/java/dev/nandi0813/practice/util/fightmapchange/FightChangeOptimized.java b/core/src/main/java/dev/nandi0813/practice/util/fightmapchange/FightChangeOptimized.java index d1947b261..111b3d354 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/fightmapchange/FightChangeOptimized.java +++ b/core/src/main/java/dev/nandi0813/practice/util/fightmapchange/FightChangeOptimized.java @@ -1,7 +1,8 @@ package dev.nandi0813.practice.util.fightmapchange; import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.module.interfaces.ChangedBlock; +import dev.nandi0813.practice.manager.fight.util.BlockUtil; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.util.Common; import dev.nandi0813.practice.util.Cuboid; import dev.nandi0813.practice.util.interfaces.Spectatable; @@ -112,7 +113,7 @@ public void addBlockChange(ChangedBlock change) { // Store Spectatable (Match/Event/FFA) for efficient metadata caching in BlockFromToEvent if (existing == null && spectatable != null) { Block block = change.getLocation().getBlock(); - block.setMetadata(PLACED_IN_FIGHT, new org.bukkit.metadata.FixedMetadataValue(ZonePractice.getInstance(), spectatable)); + BlockUtil.setMetadata(block, PLACED_IN_FIGHT, spectatable); } } @@ -290,15 +291,15 @@ public void rollback(int maxCheck, int maxChange, @org.jetbrains.annotations.Nul /** * Removes all entities efficiently. * Strategy: Remove tracked entities first, then cleanup any remaining cuboid entities. - * NOTE: Skips hologram armor stands (invisible with custom name visible) to prevent + * NOTE: Skips hologram text displays to prevent * leaderboard holograms from disappearing when matches end. */ private void removeAllEntities() { // Remove tracked entities (fast - cached references) for (Entity entity : trackedEntities) { if (entity != null && entity.isValid()) { - // Skip hologram armor stands - if (isHologramArmorStand(entity)) continue; + // Skip hologram text displays + if (isHologramTextDisplay(entity)) continue; entity.remove(); } } @@ -308,8 +309,8 @@ private void removeAllEntities() { // This catches any entities that weren't tracked for (Entity entity : cuboid.getEntities()) { if (entity instanceof Player) continue; - // Skip hologram armor stands - if (isHologramArmorStand(entity)) continue; + // Skip hologram text displays + if (isHologramTextDisplay(entity)) continue; if (entity.isValid()) { entity.remove(); } @@ -317,11 +318,11 @@ private void removeAllEntities() { } /** - * Checks if an entity is a hologram armor stand. - * Delegates to ArmorStandFactory for consistent detection. + * Checks if an entity is a hologram text display. + * Delegates to TextDisplayFactory for consistent detection. */ - private boolean isHologramArmorStand(Entity entity) { - return dev.nandi0813.practice.manager.leaderboard.hologram.ArmorStandFactory.isHologramArmorStand(entity); + private boolean isHologramTextDisplay(Entity entity) { + return dev.nandi0813.practice.manager.leaderboard.hologram.TextDisplayFactory.isHologramTextDisplay(entity); } /** @@ -336,7 +337,8 @@ public void quickRollback() { entry.getValue().changedBlock.reset(); Block block = BlockPosition.getBlock(world, entry.getKey()); - block.removeMetadata(PLACED_IN_FIGHT, ZonePractice.getInstance()); + // PLACED_IN_FIGHT uses PersistentTagUtil, so clear through BlockUtil. + BlockUtil.clearMetadata(block, PLACED_IN_FIGHT); iterator.remove(); } @@ -354,8 +356,8 @@ private void extinguishFire() { for (Block block : cuboid) { String typeName = block.getType().name(); if (typeName.equals("FIRE") || typeName.equals("SOUL_FIRE")) { - block.setType(org.bukkit.Material.AIR, false); - block.removeMetadata(PLACED_IN_FIGHT, ZonePractice.getInstance()); + block.setBlockData(org.bukkit.Material.AIR.createBlockData(), false); + BlockUtil.clearMetadata(block, PLACED_IN_FIGHT); } } } @@ -433,7 +435,8 @@ public void run() { blockEntry.changedBlock.reset(); Block block = BlockPosition.getBlock(world, pos); - block.removeMetadata(PLACED_IN_FIGHT, ZonePractice.getInstance()); + // PLACED_IN_FIGHT uses PersistentTagUtil, so clear through BlockUtil. + BlockUtil.clearMetadata(block, PLACED_IN_FIGHT); blocks.remove(pos); // Remove from live map } diff --git a/core/src/main/java/dev/nandi0813/practice/util/interfaces/Spectatable.java b/core/src/main/java/dev/nandi0813/practice/util/interfaces/Spectatable.java index ed8554197..3387a0a6d 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/interfaces/Spectatable.java +++ b/core/src/main/java/dev/nandi0813/practice/util/interfaces/Spectatable.java @@ -2,8 +2,8 @@ import dev.nandi0813.practice.manager.fight.ffa.game.FFA; import dev.nandi0813.practice.manager.fight.match.Match; +import dev.nandi0813.practice.manager.fight.util.ChangedBlock; import dev.nandi0813.practice.manager.gui.GUIItem; -import dev.nandi0813.practice.module.interfaces.ChangedBlock; import dev.nandi0813.practice.util.Cuboid; import dev.nandi0813.practice.util.fightmapchange.FightChangeOptimized; import org.bukkit.entity.Entity; @@ -13,6 +13,8 @@ public interface Spectatable { + List getActivePlayerList(); + List getSpectators(); void addSpectator(Player spectator, Player target, boolean teleport, boolean message); diff --git a/core/src/main/java/dev/nandi0813/practice/util/playerutil/PlayerUtil.java b/core/src/main/java/dev/nandi0813/practice/util/playerutil/PlayerUtil.java index 9b724d83f..a9ed192c2 100644 --- a/core/src/main/java/dev/nandi0813/practice/util/playerutil/PlayerUtil.java +++ b/core/src/main/java/dev/nandi0813/practice/util/playerutil/PlayerUtil.java @@ -4,10 +4,11 @@ import dev.nandi0813.practice.manager.backend.LanguageManager; import dev.nandi0813.practice.manager.profile.Profile; import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.module.util.ClassImport; import dev.nandi0813.practice.util.Common; import org.bukkit.Bukkit; import org.bukkit.GameMode; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; @@ -25,7 +26,7 @@ public static void clearPlayer(Player player, boolean deleteInv, boolean fly, bo player.setGameMode(GameMode.SURVIVAL); player.setAllowFlight(fly); player.setFlying(fly); - ClassImport.getClasses().getPlayerUtil().setCollidesWithEntities(player, entityCollide); + dev.nandi0813.practice.manager.fight.util.PlayerUtil.setCollidesWithEntities(player, entityCollide); if (ZonePractice.getInstance().isEnabled()) { Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> player.setFireTicks(0), 2L); @@ -33,7 +34,7 @@ public static void clearPlayer(Player player, boolean deleteInv, boolean fly, bo player.setFireTicks(0); } - if (deleteInv) ClassImport.getClasses().getPlayerUtil().clearInventory(player); + if (deleteInv) dev.nandi0813.practice.manager.fight.util.PlayerUtil.clearInventory(player); for (PotionEffect potionEffect : player.getActivePotionEffects()) player.removePotionEffect(potionEffect.getType()); @@ -48,7 +49,14 @@ public static void setFightPlayer(Player player) { Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> player.setHealth(20), 2L); Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> player.setFireTicks(0), 2L); player.setFoodLevel(25); - player.resetMaxHealth(); + AttributeInstance maxHealth = player.getAttribute(Attribute.MAX_HEALTH); + if (maxHealth != null) { + maxHealth.setBaseValue(maxHealth.getDefaultValue()); + + if (player.getHealth() > maxHealth.getValue()) { + player.setHealth(maxHealth.getValue()); + } + } player.setFallDistance(0); player.setWalkSpeed(0.2F); for (PotionEffect potionEffect : player.getActivePotionEffects()) diff --git a/core/src/main/java/dev/nandi0813/practice/util/playerutil/ProfileStatData.java b/core/src/main/java/dev/nandi0813/practice/util/playerutil/ProfileStatData.java deleted file mode 100644 index 3b0ba9988..000000000 --- a/core/src/main/java/dev/nandi0813/practice/util/playerutil/ProfileStatData.java +++ /dev/null @@ -1,78 +0,0 @@ -package dev.nandi0813.practice.util.playerutil; - -import dev.nandi0813.practice.manager.ladder.LadderManager; -import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; -import dev.nandi0813.practice.manager.profile.Profile; -import org.apache.commons.lang.StringUtils; - -public enum ProfileStatData { - ; - - // %all_unranked_wins% - // %all_unranked_losses% - // %all_ranked_wins% - // %all_ranked_losses% - // %ladder_unranked_%ladder%_wins% - // %ladder_unranked_%ladder%_losses% - // %ladder_ranked_%ladder%_wins% - // %ladder_ranked_%ladder%_losses% - // %ladder_%ladder%_elo% - // %global_elo% - - public static String replace(Profile profile, String original) { - String[] values = StringUtils.substringsBetween(original, "%", "%"); - - if (values != null) { - for (String s : values) { - String replace = getData(profile, s); - - if (replace != null) - original = original.replace("%" + s + "%", replace); - } - } - - return original; - } - - public static String getData(final Profile profile, final String identifier) { - if (identifier.equalsIgnoreCase("global_elo")) { - return String.valueOf(profile.getStats().getGlobalElo()); - } else if (identifier.contains("all")) { - if (identifier.equalsIgnoreCase("all_unranked_wins")) - return String.valueOf(profile.getStats().getWins(false)); - else if (identifier.equalsIgnoreCase("all_unranked_losses")) - return String.valueOf(profile.getStats().getLosses(false)); - else if (identifier.equalsIgnoreCase("all_ranked_wins")) - return String.valueOf(profile.getStats().getWins(true)); - else if (identifier.equalsIgnoreCase("all_ranked_losses")) - return String.valueOf(profile.getStats().getLosses(true)); - } else if (identifier.contains("ladder")) { - NormalLadder ladder = null; - for (NormalLadder sLadder : LadderManager.getInstance().getLadders()) { - if (identifier.toLowerCase().contains(sLadder.getName().toLowerCase())) { - ladder = sLadder; - break; - } - } - - if (ladder != null) { - if (identifier.contains("unranked")) { - if (identifier.contains("wins")) - return String.valueOf(profile.getStats().getLadderStat(ladder).getUnRankedWins()); - else if (identifier.contains("losses")) - return String.valueOf(profile.getStats().getLadderStat(ladder).getUnRankedLosses()); - } else if (identifier.contains("ranked")) { - if (identifier.contains("wins")) - return String.valueOf(profile.getStats().getLadderStat(ladder).getRankedWins()); - else if (identifier.contains("losses")) - return String.valueOf(profile.getStats().getLadderStat(ladder).getRankedLosses()); - } else if (identifier.contains("elo")) { - return String.valueOf(profile.getStats().getLadderStat(ladder).getElo()); - } - } - } - - return null; - } - -} diff --git a/core/src/main/resources/1.8.8/config.yml b/core/src/main/resources/1.8.8/config.yml deleted file mode 100644 index 7d49d82d8..000000000 --- a/core/src/main/resources/1.8.8/config.yml +++ /dev/null @@ -1,520 +0,0 @@ -VERSION: 17 - -# Mysql database setup. -MYSQL-DATABASE: - ENABLED: false - SAVE-PERIOD: 5 # The server saves the player statistics for this minute interval to the mysql database. - CONNECTION: - HOST: localhost - PORT: 3306 - DATABASE: zonepractice - USER: root - PASSWORD: "" -# Knockback modifier - it very much depends on the hit delay. You should test what is the optimal for you. -KNOCKBACK: - NORMAL: - AIR-HORIZONTAL: 0.93 - AIR-VERTICAL: 0.93 - HORIZONTAL: 0.82 - VERTICAL: 0.88 - COMBO: - AIR-HORIZONTAL: 2.8 - AIR-VERTICAL: 2.8 - HORIZONTAL: 2.5 - VERTICAL: 2.5 -# -# Queue settings -QUEUE: - UNRANKED: - MAX-QUEUE-TIME: 300 # In sec. - GUI-UPDATE-MINUTE: 2 - DIVISION-SEARCH: - ENABLED: true - SETTINGS: - SEARCH-IN-OWN-DIVISIONS: 20 # In sec. - EXTEND-DIVISION-SEARCH: 10 # In sec. - SELECTOR-GUI: - SHOW-DISABLED-LADDERS: true - FIRST-CATEGORY: - SIZE: 4 - GO-TO-SECOND-CATEGORY-SLOT: 35 - LADDER-SLOTS: - - "BATTLERUSH::10" - - "BEDWARS::11" - - "BOXING::12" - - "BRIDGES::14" - - "FIREBALL::15" - - "GAPPLE::16" - - "NODEBUFF::20" - - "COMBO::21" - - "SUMO::22" - - "BUILDUHC::23" - - "PEARLFIGHT::24" - SECOND-CATEGORY: - ENABLED: true - BACK-TO-FIRST-CATEGORY-SLOT: 35 - SIZE: 4 - LADDER-SLOTS: - - "ARCHER::10" - - "AXE::11" - - "DEBUFF::12" - - "SG::14" - - "SKYWARS::15" - - "SOUP::16" - - "SPLEEF::20" - - "VANILLA::24" - RANKED: - MAX-QUEUE-TIME: 300 # In sec. - GUI-UPDATE-MINUTE: 1 - DEFAULT-ELO: 1000 - ELO-RANGE-TIME: 5 # Sec - ELO-RANGE-INCREASE: 20 # Range - ELO-CHANGE: 5-12 # Players receive a random elo between these two numbers. - MAX-PING: 300 # Maximum ping a player can join a ranked queue. - SELECTOR-GUI: - SHOW-DISABLED-LADDERS: true - FIRST-CATEGORY: - SIZE: 4 - GO-TO-SECOND-CATEGORY-SLOT: 35 - LADDER-SLOTS: - - "BATTLERUSH::10" - - "BEDWARS::11" - - "BOXING::12" - - "BRIDGES::14" - - "FIREBALL::15" - - "GAPPLE::16" - - "NODEBUFF::20" - - "COMBO::21" - - "SUMO::22" - - "BUILDUHC::23" - - "PEARLFIGHT::24" - SECOND-CATEGORY: - ENABLED: true - BACK-TO-FIRST-CATEGORY-SLOT: 18 - SIZE: 3 - LADDER-SLOTS: - - "DEBUFF::11" - - "SG::12" - - "SKYWARS::13" - - "SOUP::14" - - "SPLEEF::15" -# -# Admin settings -ADMIN-SETTINGS: - OP-BYPASS-ELO-CHANGE: true # If true, op players ladder elo's cannot be changed by commands. - OP-BYPASS-UNRANKED-CHANGE: true # If true, commands cannot change op players' daily unranked limit. - OP-BYPASS-RANKED-CHANGE: true # If true, commands cannot change op players daily ranked limit. - OP-BYPASS-EXP-CHANGE: true # If true, commands cannot change op players' experience. - OP-BYPASS-INFOGUI: true # If true, op players info gui can only be opened by themselves. - OP-BYPASS-FULL-RESET: true # If true, they can only reset op players themselves. -# -# Auto save settings -# -# It basically doesn't affect the server performance since it happens async. -AUTO-SAVE: - ENABLED: true # It is recommended to enable this, as the plugin is only saved during automatic backups and when the server is shut down. If it crashes and auto-save is disabled, all progress will be lost. - ALERT: true - INTERVAL: 10 # minutes -# -# Match settings -MATCH-SETTINGS: - TEAMS: - TEAM1: - NAME: "[B]" - COLOR: "" - NAMETAG: - PREFIX: " " - NAME-COLOR: "BLUE" - SUFFIX: "" - TEAM2: - NAME: "[R]" - COLOR: "" - NAMETAG: - PREFIX: " " - NAME-COLOR: "RED" - SUFFIX: "" - FFA: - COLOR: - "" - MATCH-TYPE-NAMES: - DUEL: "&e&lDuel" - PARTY_FFA: "&e&lParty FFA" - PARTY_SPLIT: "&e&lParty Split" - PARTY_VS_PARTY: "&e&lParty Vs Party" - WEIGHT-CLASS: - UNRANKED: "&aUnranked" - RANKED: "&cRanked" - LEAVE-COMMAND: - ENABLED: true - WEIGHT-CLASS: - UNRANKED: true - RANKED: false - END-COMMAND: - DUEL: - UNRANKED: - WINNER-COMMANDS: - - "" - LOSER-COMMANDS: - - "" - RANKED: - WINNER-COMMANDS: - - "" - LOSER-COMMANDS: - - "" - START-COMMAND: - LADDER_NAME: # like GAPPLE etc. always write with upper case - MATCH: - - "" - ROUND: - - "" - MATCH-STATISTIC: - REMOVE-AFTER: 60 # After the seconds, the players won't be able to open their match statistics. - MAX-QUEUE-TIME: 300 # Sec - BUILD-LIMIT-DEFAULT: 4 # Counts from the first players positions Y level. You can set a unique number for this for every arena, then it will consider where you are standing. - AFTER-COUNTDOWN: 3 # After the match is over this countdown start, and when it's over, the players teleport back to the lobby. - GOLDEN-HEAD: # Golden head settings. - ITEM: - NAME: "&e&lGolden Head" - MATERIAL: GOLDEN_APPLE - DAMAGE: 1 - LORE: - - "" - - "&7This apple gives you extra" - - "&7health and effects." - - "" - # - # You can add any potion effects for the golden head. - # But it has to follow a strict format like below: - # POTION_TYPE::DURATION_IN_SECONDS::STRENGTH - # You can find the potion types in here: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffectType.html - EFFECTS: - - "ABSORPTION::90::1" - - "REGENERATION::20::2" - REMOVE-EMPTY-BOTTLE: true # Removes empty potion bottles after the player use it. - DUEL: - RIGHT-CLICK-TO-DUEL: true # When enabled, players can right-click another player in the lobby to send them a duel request. - INVITATION-EXPIRY: 60 # After the seconds, the duel request will expire. - ROUND-SELECTOR: - MAX: 10 - MIN: 1 # Can't be lower than 1. - ENDERPEARL: - COOLDOWN: 13 # This is the default cooldown. You can change it in the ladder settings. - EXP-BAR: true # Countdown shows on exp bar. - FIREBALL-FIGHT: # These are multiplier values, so please test what is optimal for you and don't change them too much at once or the difference will multiply. - FIREBALL-SPEED: 1.3 - FIREBALL-YIELD: 2f - EXPLOSION: - TNT: - HORIZONTAL: 1.9 - VERTICAL: 2.1 - FIREBALL: - HORIZONTAL: 1.7 - VERTICAL: 1.7 - PARTY: - SPLIT-TEAM-DAMAGE: false # In party split games, players with the same team can't hurt each other (if false). - PARTY-VS-PARTY-TEAM-DAMAGE: false # In party vs party games, players with the same party can't hurt each other (if false). - REMATCH: # Players get an item in their lobby inventory after duels, so they can easily request a rematch. - ENABLED: true - EXPIRE-TIME: 20 # sec - KIT-ITEMS: - DEFAULT-KIT: - NAME: "&e&lDefault Kit" - MATERIAL: ENCHANTED_BOOK - CUSTOM-KIT: - NAME: "&a&lKit %kit%" - MATERIAL: ENCHANTED_BOOK - LADDER-SETTINGS: - BRIDGE: - REGENERATING-ARROW: - ENABLED: true - EXP-BAR: true - TIME: 5 # In sec. - DISPLAY-ARROW-HIT-HEALTH: true # If true, the player will see the health of the player they hit. -# -# FFA settings -FFA: - ROLLBACK: - SECONDS: 300 # After the seconds, the arena will be reseted back to its original state (only on build arenas). - DISPLAY-ARROW-HIT-HEALTH: true # If true, the player will see the health of the player they hit. - ENDER-PEARL-EXP-BAR: true # If true, the ender pearl cooldown will be displayed on the exp bar. - ALLOW-DESTROYABLE-BLOCK: true # If true, player can destroy the fixed blocks in the arena that their ladder has. - ENABLE_TNT: true # If true, players can use TNT in the arena (ONLY IN BUILD MODE). -# -# Spectator settings -SPECTATOR-SETTINGS: - SPECTATOR-MODE: true # If false, player can't use spectator mode, only watch single matches. - SPECTATOR-MENU: true # Turn on/off the spectator menu. - VANISH-COOLDOWN: 5 # Between vanish toggles this many seconds has to pass. - RANDOM-MATCH-COOLDOWN: 10 # Between random match searches, this many seconds has to pass. - SPECTATOR-SPEED: 2 # The spectators flying speed. Between 1 and 10 -# -# Party settings -PARTY: - SETTINGS: - MAX-PARTY-MEMBERS: - DEFAULT: 6 # Maximum party members, if the owner doesn't have permission to change it. - PERMISSION: 20 # The maximum limit the party leader can set for the party. - DEFAULT: - PUBLIC-PARTY: false - ALL-INVITE: false - PARTY-CHAT: true - DUEL-REQUESTS: true - PUBLIC-BROADCAST-TIME: 20 # The party will be advertised at these intervals (seconds). - BROADCAST-TIMES: 5 # This many times the party will broadcast in the chat. - PARTY-INVITE-COOLDOWN: 60 # After these seconds, the party invite will expire. - REQUEST-EXPIRY: 60 # After the seconds the party vs party request will expire. - END-MATCH-ON-DISBAND: true # If the party is disbanded, the ongoing match will end. -# -# Staff mode -STAFF-MODE: - JOIN-HIDE-FROM-PLAYERS: false # When a staff joins, the server instantly hides them from other players. - STAFF-SPECTATOR-SPEED: 2 # Staff mode spectation flying speed. -# -# Sounds - You can find the sound list here: https://helpch.at/docs/1.8.8/index.html?org/bukkit/Sound.html -SOUNDS: - MATCH_START_COUNTDOWN: - ENABLED: true - SOUND: NOTE_PLING - VOLUME: 1 - PITCH: 1 - MATCH_STARTED: - ENABLED: true - SOUND: LEVEL_UP - VOLUME: 1 - PITCH: 1 - BED_BREAK: - ENABLED: true - SOUND: ENDERDRAGON_GROWL - VOLUME: 1 - PITCH: 1 - MATCH_PLAYER_TEMP_DEATH: # When a bed fight player dies in a match while he still has his bed. - ENABLED: true - SOUND: LEVEL_UP - VOLUME: 1 - PITCH: 1 - MATCH_PLAYER_DEATH: - ENABLED: true - SOUND: BLAZE_DEATH - VOLUME: 1 - PITCH: 1 - EVENT_QUEUE_COUNTDOWN: - ENABLED: true - SOUND: NOTE_PLING - VOLUME: 1 - PITCH: 1 - EVENT_START_COUNTDOWN: - ENABLED: true - SOUND: NOTE_PLING - VOLUME: 1 - PITCH: 1 -# -# Leaderboard settings -LEADERBOARD: - HOLOGRAM: - DYNAMIC-UPDATE: 10 # Sec. This type of hologram is switching between ladders. - STATIC-UPDATE: 30 # Sec. This type of hologram is always show one ladder or global elo stats. - FORMAT: # Also placeholders: %division%, %division_short%, %group%, %ladder_name% - NULL-LINE: "&6%number%. &cN/A" - NOTHING-TO-DISPLAY: "&cThere is nothing to display." - ELO: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6ELO Top" - - "%top%" - LADDER: - - "&6ELO Top &7- &e%ladder_displayName%" - - "%top%" - WIN: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6Win Top" - - "%top%" - LADDER: - - "&6Win Top &7- &e%ladder_displayName%" - - "%top%" - KILLS: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6Kill Top" - - "%top%" - LADDER: - - "&6Kill Top &7- &e%ladder_displayName%" - - "%top%" - DEATHS: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6Deaths Top" - - "%top%" - LADDER: - - "&6Deaths Top &7- &e%ladder_displayName%" - - "%top%" - WIN_STREAK: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6Win Streak Top" - - "%top%" - LADDER: - - "&6Win Streak Top &7- &e%ladder_displayName%" - - "%top%" - BEST_WIN_STREAK: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6Best Win Streak Top" - - "%top%" - LADDER: - - "&6Best Win Streak Top &7- &e%ladder_displayName%" - - "%top%" - LOSE_STREAK: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6Lose Streak Top" - - "%top%" - LADDER: - - "&6Lose Streak Top &7- &e%ladder_displayName%" - - "%top%" - BEST_LOSE_STREAK: - TITLE-LINE-SPACING: 0.5 - LINE-SPACING: 0.3 - FORMAT: "&6%placement%. %division% | %player%&8: &e%score%" - LINES: - GLOBAL: - - "&6Best Lose Streak Top" - - "%top%" - LADDER: - - "&6Best Lose Streak Top &7- &e%ladder_displayName%" - - "%top%" - SETUP-HOLO: - TITLE: "&cThis hologram must be set." - LINE: "&6Hologram Name: &e%name%" -# -# Sidebar settings -SIDEBAR: - UPDATE-TIME: 20 # In ticks. 20 ticks = 1 second -# -# Arena settings -ARENA: - LOAD-CHUNKS: true # If true, the server will load the enabled arena's chunks. - TELEPORT-TO-COPY: false # Recommend: false, If you copy an arena, the server will teleport you there, so you can watch it happening. - FAST-COPY: false # If true, the server more likely to be slow, but it triples the copy performance. 100x50x65 arena copy takes 1,5 minutes with fast copy. - DEFAULT-ICON: # If default icon is enabled it won't be necessary to set an arena icon, but you still can. - ENABLED: false - ICON: - NAME: "&6%arena%" - MATERIAL: FIREWORK_CHARGE - # DAMAGE: 4 # You can set the damage to the material as well. -# -# Event settings -EVENT: - MULTIPLE: false # If true, multiple events can happen in the same time. But only one can be in the collecting phase. - AUTO-EVENTS: true - ENDERPEARL-COOLDOWN: 10 # In sec. - BROADCAST: - ENABLE: true - MESSAGE-TO: - IN-PARTY: true # If true and the player is a member of a party, he will receive the broadcast message. - IN-UNRANKED-MATCH: true # If true and the player is in an unranked match, he will receive the broadcast message. - IN-RANKED-MATCH: false # If true and the player is in a ranked match, he will receive the broadcast message. - IN-EVENT: true # If true and the player is in another event, he will receive the broadcast message. - PLAYER-TRACKER: # Shows the nearest player. - NAME: "&cPlayer Tracker &7(Right-Click)" - MATERIAL: COMPASS - LMS: # Please be aware that building is not yet supported for the event. - NAME: "LMS" - SETTINGS: - DROP-INVENTORY: true # If a player dies, drop his inventory. - WINNER-COMMAND: - - "practice ranked add %player% 3" - AUTO-EVENTS: # At this time of the day an automatic lms event is going to start. You can extend the list, and add it to other events as well. If you have any question about this, please join the discord server. - - "18:30" - OITC: - NAME: "OITC" - SETTINGS: - PLAYER-LIFE: 5 # Every player gets this many lives. When they die, they loose 1 life. - WINNER-COMMAND: - - "practice ranked add %player% 3" - - "eco give %player% 10" - TNTTAG: - NAME: "TNT Tag" - WINNER-COMMAND: - - "practice ranked add %player% 3" - TAGGED-ITEM: - NAME: "&cYou're IT, tag someone!" - MATERIAL: TNT - BRACKETS: # Please be aware that building is not yet supported for the event. - NAME: "Brackets" - WINNER-COMMAND: - - "practice ranked add %player% 3" - SUMO: - NAME: "Sumo" - WINNER-COMMAND: - - "practice ranked add %player% 3" - SPLEGG: # Please be aware that building is not yet supported for the event. - NAME: "Splegg" - WINNER-COMMAND: - - "practice ranked add %player% 3" - EGG-LAUNCHER-ITEM: - NAME: "&aShoot The Blocks &7(Right-Click)" - MATERIAL: IRON_SPADE - JUGGERNAUT: # Please be aware that building is not yet supported for the event. - NAME: "Juggernaut" - WINNER-COMMAND: - - "practice ranked add %player% 3" -# -# Player settings -PLAYER: - DELETE-INACTIVE-USER: - ENABLED: true - DAYS: 30 # After this number of days, the inactive player profiles will be deleted. - SETTINGS-DELAY: 3 # Sec between settings can be changed. It can be bypassed. - LOBBY-NAMETAG: - ENABLED: true - NAMETAG-MANAGEMENT: - ENABLED: true # If false, ZonePractice will not manage nametags (above-head prefix/suffix/color) or the tab-list at all. - JOIN-TELEPORT-LOBBY: true # If true, the player will be teleported to the lobby when they join the server. - GROUP-CHAT: - ENABLED: true # If enabled, the player's chat will be formatted by their group. It is only viable if "SERVER-CHAT" is also enabled. - DEFAULT-SETTINGS: - DUELREQUEST: true - SIDEBAR: true - HIDEPLAYERS: false - PARTYINVITES: true - ALLOWSPECTATE: true - PRIVATEMESSAGE: true - FLYING: false - WORLD-TIME: DAY # Options: SUNRISE, DAY, SUNSET, NIGHT -# -# Division settings -DIVISIONS: - ENABLED: true - NEW-DIVISION-MESSAGE: true - MIN-DIVISION-FOR-RANKED: SILVER2 # Have to give the config name, not the full name -# -# Chat settings -CHAT: - SERVER-CHAT-ENABLED: true - PARTY-CHAT-ENABLED: true - STAFF-CHAT: - ENABLED: true - SHORTCUT: true # If true, you can use send message like #hello world instead of enabling staff chat each time. - PRIVATE-CHAT-ENABLED: true # Private message system /message (/m) and /reply (/re, /r) \ No newline at end of file diff --git a/core/src/main/resources/1.8.8/divisions.yml b/core/src/main/resources/1.8.8/divisions.yml deleted file mode 100644 index 9babfdd23..000000000 --- a/core/src/main/resources/1.8.8/divisions.yml +++ /dev/null @@ -1,279 +0,0 @@ -VERSION: 3 - -############################## -# You can only create maximum 28 divisions. Anything above that the server is going to ignore. -############################## -# Placeholders: %division%, %division_short% -############################## -REQUIRE: # if both are false wins will be set to true in the backend - WINS: true - ELO: true # depends on the global elo - -DIVISIONS: - RECRUIT: - DATA: - NAME: - FULL: "%color%Recruit" - SHORT: "%color%R" - COLOR: "" - ICON-MATERIAL: IRON_INGOT - REQUIREMENTS: - EXPERIENCE: 0 - WINS: 0 - ELO: 0 - SILVER1: - DATA: - NAME: - FULL: "%color%Silver I" - SHORT: "%color%I" - COLOR: "" - ICON-MATERIAL: IRON_INGOT - REQUIREMENTS: - EXPERIENCE: 1000 - WINS: 10 - ELO: 1050 - SILVER2: - DATA: - NAME: - FULL: "%color%Silver II" - SHORT: "%color%II" - COLOR: "" - ICON-MATERIAL: IRON_INGOT - REQUIREMENTS: - EXPERIENCE: 2000 - WINS: 20 - ELO: 1100 - SILVER3: - DATA: - NAME: - FULL: "%color%Silver III" - SHORT: "%color%III" - COLOR: "" - ICON-MATERIAL: IRON_INGOT - REQUIREMENTS: - EXPERIENCE: 3000 - WINS: 30 - ELO: 1150 - SILVER4: - DATA: - NAME: - FULL: "%color%Silver IV" - SHORT: "%color%IV" - COLOR: "" - ICON-MATERIAL: IRON_INGOT - REQUIREMENTS: - EXPERIENCE: 4000 - WINS: 40 - ELO: 1200 - SILVER5: - DATA: - NAME: - FULL: "%color%Silver V" - SHORT: "%color%V" - COLOR: "" - ICON-MATERIAL: IRON_INGOT - REQUIREMENTS: - EXPERIENCE: 5000 - WINS: 50 - ELO: 1250 - GOLD1: - DATA: - NAME: - FULL: "%color%Gold I" - SHORT: "%color%I" - COLOR: "" - ICON-MATERIAL: GOLD_INGOT - REQUIREMENTS: - EXPERIENCE: 7000 - WINS: 70 - ELO: 1300 - GOLD2: - DATA: - NAME: - FULL: "%color%Gold II" - SHORT: "%color%II" - COLOR: "" - ICON-MATERIAL: GOLD_INGOT - REQUIREMENTS: - EXPERIENCE: 9000 - WINS: 90 - ELO: 1350 - GOLD3: - DATA: - NAME: - FULL: "%color%Gold III" - SHORT: "%color%III" - COLOR: "" - ICON-MATERIAL: GOLD_INGOT - REQUIREMENTS: - EXPERIENCE: 11000 - WINS: 110 - ELO: 1400 - GOLD4: - DATA: - NAME: - FULL: "%color%Gold IV" - SHORT: "%color%IV" - COLOR: "" - ICON-MATERIAL: GOLD_INGOT - REQUIREMENTS: - EXPERIENCE: 13000 - WINS: 130 - ELO: 1450 - GOLD5: - DATA: - NAME: - FULL: "%color%Gold V" - SHORT: "%color%V" - COLOR: "" - ICON-MATERIAL: GOLD_INGOT - REQUIREMENTS: - EXPERIENCE: 15000 - WINS: 150 - ELO: 1500 - PLATINUM1: - DATA: - NAME: - FULL: "%color%Platinum I" - SHORT: "%color%I" - COLOR: "" - ICON-MATERIAL: QUARTZ - REQUIREMENTS: - EXPERIENCE: 18000 - WINS: 180 - ELO: 1550 - PLATINUM2: - DATA: - NAME: - FULL: "%color%Platinum II" - SHORT: "%color%II" - COLOR: "" - ICON-MATERIAL: QUARTZ - REQUIREMENTS: - EXPERIENCE: 21000 - WINS: 210 - ELO: 1600 - PLATINUM3: - DATA: - NAME: - FULL: "%color%Platinum III" - SHORT: "%color%III" - COLOR: "" - ICON-MATERIAL: QUARTZ - REQUIREMENTS: - EXPERIENCE: 24000 - WINS: 240 - ELO: 1650 - EMERALD1: - DATA: - NAME: - FULL: "%color%Emerald I" - SHORT: "%color%I" - COLOR: "" - ICON-MATERIAL: EMERALD - REQUIREMENTS: - EXPERIENCE: 28000 - WINS: 280 - ELO: 1700 - EMERALD2: - DATA: - NAME: - FULL: "%color%Emerald II" - SHORT: "%color%II" - COLOR: "" - ICON-MATERIAL: EMERALD - REQUIREMENTS: - EXPERIENCE: 32000 - WINS: 320 - ELO: 1750 - EMERALD3: - DATA: - NAME: - FULL: "%color%Emerald III" - SHORT: "%color%III" - COLOR: "" - ICON-MATERIAL: EMERALD - REQUIREMENTS: - EXPERIENCE: 36000 - WINS: 360 - ELO: 1800 - DIAMOND1: - DATA: - NAME: - FULL: "%color%Diamond I" - SHORT: "%color%I" - COLOR: "" - ICON-MATERIAL: DIAMOND - REQUIREMENTS: - EXPERIENCE: 41000 - WINS: 410 - ELO: 1850 - DIAMOND2: - DATA: - NAME: - FULL: "%color%Diamond II" - SHORT: "%color%II" - COLOR: "" - ICON-MATERIAL: DIAMOND - REQUIREMENTS: - EXPERIENCE: 46000 - WINS: 460 - ELO: 1900 - DIAMOND3: - DATA: - NAME: - FULL: "%color%Diamond III" - SHORT: "%color%III" - COLOR: "" - ICON-MATERIAL: DIAMOND - REQUIREMENTS: - EXPERIENCE: 51000 - WINS: 510 - ELO: 1950 - SAPPHIRE1: - DATA: - NAME: - FULL: "%color%Sapphire I" - SHORT: "%color%I" - COLOR: "" - ICON-MATERIAL: INK_SACK - ICON-DAMAGE: 4 - REQUIREMENTS: - EXPERIENCE: 57000 - WINS: 570 - ELO: 2000 - SAPPHIRE2: - DATA: - NAME: - FULL: "%color%Sapphire II" - SHORT: "%color%II" - COLOR: "" - ICON-MATERIAL: INK_SACK - ICON-DAMAGE: 4 - REQUIREMENTS: - EXPERIENCE: 63000 - WINS: 630 - ELO: 2050 - SAPPHIRE3: - DATA: - NAME: - FULL: "%color%Sapphire III" - SHORT: "%color%III" - COLOR: "" - ICON-MATERIAL: INK_SACK - ICON-DAMAGE: 4 - REQUIREMENTS: - EXPERIENCE: 69000 - WINS: 690 - ELO: 2100 - MASTER: - DATA: - NAME: - FULL: "%color%Master" - SHORT: "%color%M" - COLOR: "" - ICON-MATERIAL: BLAZE_POWDER - REQUIREMENTS: - EXPERIENCE: 100000 - WINS: 1000 - ELO: 2500 \ No newline at end of file diff --git a/core/src/main/resources/1.8.8/guis.yml b/core/src/main/resources/1.8.8/guis.yml deleted file mode 100644 index f27a15820..000000000 --- a/core/src/main/resources/1.8.8/guis.yml +++ /dev/null @@ -1,2873 +0,0 @@ -VERSION: 12 - -GENERAL-FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 -GUIS: - ARENA-CREATE: - TITLE: "&6What type for &c%arena%&6?" - LADDER-CREATE: - TITLE: "&6What type for &c%ladder%&6?" - VALIDATION-GUI: - TITLE: "&8Validation" - ICONS: - CANCEL: - NAME: "&cCancel" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - APPROVE: - NAME: "&aApprove" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - KIT-EDITOR: # %ladder% display the Display Name of the ladder (official icon name), but you can also use %ladderOriginal% which is the given name of the ladder. - EDITOR-MENU: - TITLE: "&6&lSelect what to edit" - ICONS: - FILLER_ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - PREMADE-LADDER: - NAME: "&6&lPremade Ladder" - MATERIAL: GOLD_SWORD - LORE: - - "&8&m------------------------" - - "&7Click here to edit a &6premade" - - "&7ladder." - - "&8&m------------------------" - PLAYER-LADDER: - NAME: "&a&lOwn Ladder" - MATERIAL: FIREBALL - LORE: - - "&8&m------------------------" - - "&7Click here to edit your &aown" - - "&7ladder." - - "&8&m------------------------" - PLAYER-CUSTOM-KIT-SELECTOR: - TITLE: "&8Select a kit to edit" - ICONS: - KIT: - NAME: "&7[&f%kit%&7]" - MATERIAL: WRITTEN_BOOK - UNSELECTED: - NAME: "&7[&fUnselected&7]" - MATERIAL: WOOL - DAMAGE: 8 - SELECTED: - NAME: "&7[&aSelected&7]" - MATERIAL: WOOL - DAMAGE: 10 - GUIDE: - NAME: "&bGuide" - MATERIAL: PAPER - LORE: - - "&fAfter selecting a kit, you can" - - "&fplay with it by dueling other" - - "&fplayers or play in parties." - LADDER-SELECTOR: - TITLE: "&9&lSelect a kit to edit." - ICONS: - NAME: "%ladder%" - LORE: - - "" - - "&aClick here to select &e%ladder%&a." - DUEL-ROUND-SELECTOR: - TITLE: "&8Select the amount of rounds" - ICONS: - BACK-TO: - NAME: "&cBack to" - MATERIAL: ARROW - ROUND-SELECTOR: - NAME: "&7Rounds: &6%rounds%" - MATERIAL: FIREWORK_CHARGE - LORE: - - "" - - "&7The first player/team to reach" - - "&7the, winning rounds wins." - - "" - - "&7Recommended: &e%recommended_rounds% rounds&7." - - "" - - "&a&lLEFT-CLICK &ato reduce the rounds." - - "&b&lRIGHT-CLICK &bto increase the rounds." - SHOW-ARENA: - NAME: "&eSelected Arena: %arena%" - MATERIAL: DIRT # In case the arena doesn't have an icon - LORE: - - "" - - "&7You've selected this arena for the match." - SHOW-LADDER: - NAME: "&eSelected Ladder: %ladder%" - MATERIAL: DIRT # In case the ladder doesn't have an icon - LORE: - - "" - - "&7You've selected this ladder for the match." - START-MATCH: - NAME: "&aStart Match" - MATERIAL: EMERALD - LORE: - - "" - - "&7Click here to start the match." - - "&7The match will start with the selected" - - "&7arena and ladder." - KIT-SELECTOR: - TITLE: "&8Viewing %ladder% kits" - ICONS: - BACK-TO-KIT-SELECTOR: - NAME: "&cBack to kit selector" - MATERIAL: ARROW - CREATE-KIT: - NAME: "&a&lCreate Kit" - MATERIAL: STONE_SWORD - EXISTING-KIT: - NAME: "&6&lKit %kit%" - MATERIAL: GOLD_SWORD - EDIT-KIT: - NAME: "&a&lEdit Kit" - MATERIAL: BOOK - DELETE-KIT: - NAME: "&c&lDelete Kit" - MATERIAL: REDSTONE - LORE: - - "&8&m------------------------" - - "&c&lYou won't be able to" - - "&crecover this kit." - - "&8&m------------------------" - NO-PERMISSION: - NAME: "&cYou don't have permission" - MATERIAL: WOOD_SWORD - FILLER-ITEM-1: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - FILLER-ITEM-2: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - KIT-EDITOR: - TITLE: "&8Editing Kit %kit%" # Also available: %weightClass% - ICONS: - INFO: - NAME: "&2Informations" - MATERIAL: NAME_TAG - LORE: - - "&8&m------------------------" - - " &e» &7Ladder: &e%ladder%" - - " &e» &7Kit: &e%kit%" - - " &e» &7WeightClass: &e%weightClass%" - - "&8&m------------------------" - SAVE: - NAME: "&a&lSave" - MATERIAL: WOOL - DAMAGE: 5 - LORE: - - "&8&m------------------------" - - "&e&lClick here &eto save" - - "ðe custom kit." - - "&8&m------------------------" - LOAD-DEFAULT: - NAME: "&e&lLoad Default Kit" - MATERIAL: WOOL - DAMAGE: 4 - LORE: - - "&8&m------------------------" - - "&e&lClick here &eto load the default" - - "&ekit to your inventory." - - "&8&m------------------------" - CANCEL: - NAME: "&c&lCancel" - MATERIAL: WOOL - DAMAGE: 14 - LORE: - - "&8&m------------------------" - - "&e&lClick here &eto abort editing the" - - "&ekit, and return to the kit menu." - - "&8&m------------------------" - FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 1 - SWITCH-TO-UNRANKED: - NAME: "&aSwitch to %weightClass%" - MATERIAL: WOOD_SWORD - SWITCH-TO-RANKED: - NAME: "&aSwitch to %weightClass%" - MATERIAL: IRON_SWORD - ONLY-UNRANKED: - NAME: "&cThis ladder is only %weightClass%" - MATERIAL: REDSTONE - ONLY-RANKED: - NAME: "&cThis ladder is only %weightClass%" - MATERIAL: REDSTONE - NO-EFFECT: - NAME: "&5Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "&7This ladder has no effects." - - "&8&m------------------------" - HAS-EFFECT: - FORMAT: "&d%name% %amplifier% &7for %time%" - ICON: - NAME: "&5Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "&eYou will get these effects," - - "&ewhen the game starts." - - "" - - "%effects%" - - "&8&m------------------------" - STATISTICS: - SELECTOR: - TITLE: "&cSelect statistics to view" - ICONS: - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - OWN-PLAYER-STATS: - NAME: "&c%player% &7- &fStatistic" - LORE: - - "&8&m------------------------" - - "&7Click here to view your personal" - - "&7statistics for each kit." - - "&8&m------------------------" - PLAYER-STATS: - NAME: "&c%target% &7- &fStatistic" - LORE: - - "&8&m------------------------" - - "&7Click here to view" - - "&c%target%'s &7kit statistics." - - "&8&m------------------------" - ELO-LEADERBOARD: - NAME: "&eELO Leaderboards" - MATERIAL: SNOW_BALL - LORE: - - "&8&m------------------------" - - "&7Click here to view the" - - "&eelo &7leaderboards." - - "&8&m------------------------" - TOP-WIN-LEADERBOARD: - NAME: "&6Top Win Leaderboard" - MATERIAL: SLIME_BALL - LORE: - - "&8&m------------------------" - - "&7Click here to view the" - - "&6top win &7leaderboards." - - "&8&m------------------------" - VIEW-DIVISIONS: - HAS-NEXT: - NAME: "&cDivisions" - MATERIAL: BOOK - LORE: - - "" - - " &c┃ &fCurrent Division: %division_fullName%" - - " &c┃ &fExperience: &c%exp%" - - " &c┃ &fWins: &c%wins%" - - " &c┃ &fElo: &c%elo%" - - "" - - " &c┃ &fNext Division: %nextDivision_fullName%" - - " &c┃ &fProgress: &a%progress_bar% &f(%progress_percent%%)" - - "" - - "&aLeft Click &7to view all division." - NO-NEXT: - NAME: "&cDivisions" - MATERIAL: BOOK - LORE: - - "" - - " &c┃ &fYour Division: %division_fullName%" - - " &c┃ &fExperience: &c%exp%" - - " &c┃ &fWins: &c%wins%" - - " &c┃ &fElo: &c%elo%" - - "" - - "&eYou have reached the last division." - ELO-LEADERBOARD: - TITLE: "&eTop ELO Leaderboard" - ICONS: - FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 4 - BACK-TO-HUB: - NAME: "&eBack to hub" - MATERIAL: ARROW - REFRESH-ITEM: - NAME: "&cRefresh" - MATERIAL: CLAY_BALL - LORE: - - "&8&m------------------------" - - "&7Click here to refresh" - - "&7the leaderboard" - - "" - - "&c&lNOTE: &7The leaderboards automatically" - - "&7refresh every time you open the GUI." - - "&8&m------------------------" - GLOBAL-LEADERBOARD: - NAME: "&eGlobal Elo Leaderboard &7- &fTop %number%" - MATERIAL: "NETHER_STAR" - LORE: - FORMAT: "&6%number%. %division% | %player%&8: &e%global_elo%" - FORMAT-NULL: "&6%number%. &7| &cN/A" - LEADERBOARD: - - "&8&m------------------------" - - "%top%" - - "&8&m------------------------" - NO-LEADERBOARD: - - "&8&m------------------------" - - "&cThere is no leaderboard to display" - - "&8&m------------------------" - LADDER-LEADERBOARD: - NAME: "%ladder% &eELO &7- &fTop %number%" - LORE: - FORMAT: "&6%number%. %division% | %player%&8: &e%ladder_elo%" - FORMAT-NULL: "&6%number%. &7| &cN/A" - LEADERBOARD: - - "&8&m------------------------" - - "%top%" - - "&8&m------------------------" - NO-LEADERBOARD: - - "&8&m------------------------" - - "&cThere is no leaderboard to display" - - "&8&m------------------------" - WIN-LEADERBOARD: - TITLE: "&6Top Wins Leaderboards" - ICONS: - FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 1 - BACK-TO-HUB: - NAME: "&eBack to hub" - MATERIAL: ARROW - GLOBAL-LEADERBOARD: - NAME: "&eGlobal Elo Leaderboard &7- &fTop %number%" - MATERIAL: "NETHER_STAR" - LORE: - FORMAT: "&6%number%. %division% | %player%&8: &e%global_win%" - FORMAT-NULL: "&6%number%. &7| &cN/A" - LEADERBOARD: - - "&8&m------------------------" - - "%top%" - - "&8&m------------------------" - NO-LEADERBOARD: - - "&8&m------------------------" - - "&cThere is no leaderboard to display" - - "&8&m------------------------" - LADDER-LEADERBOARD: - NAME: "%ladder% &6Win &7- &fTop %number%" - LORE: - FORMAT: "&6%number%. &e%player%&8: &f%ladder_win%" - FORMAT-NULL: "&6%number%. &cN/A" - LEADERBOARD: - - "&8&m------------------------" - - "%top%" - - "&8&m------------------------" - NO-LEADERBOARD: - - "&8&m------------------------" - - "&cThere is no leaderboard to display" - - "&8&m------------------------" - PLAYER-STATISTICS: - TITLE: "&c%player%'s &8Stats" - ICONS: - FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 1 - BACK-TO-HUB: - NAME: "&eBack to hub" - MATERIAL: ARROW - ALL-STAT: - NAME: "&c%player% &7- &fStatistics" - LORE: - - "&8&m------------------------" - - "&eUnranked Wins: &f%unranked_wins%" - - "&eUnranked Losses: &f%unranked_losses%" - - "&eUnranked W/L Ratio: &f%unranked_w/l_ratio%" - - "" - - "&eRanked Wins: &f%ranked_wins%" - - "&eRanked Losses: &f%ranked_losses%" - - "&eRanked W/L Ratio: &f%ranked_w/l_ratio%" - - "" - - "&eWins: &f%global_wins%" - - "&eLosses: &f%global_losses%" - - "&eW/L Ratio: &f%w/l_ratio%" - - "" - - "&eGlobal ELO: &f%global_elo%" - - "&eDivision: %division%" - - "&8&m------------------------" - UNRANKED-LADDER-STATS: - NAME: "%ladder%" - LORE: - - "&8&m------------------------" - - "&eUnranked Wins: &f%unranked_wins%" - - "&eUnranked Losses: &f%unranked_losses%" - - "&eUnranked W/L Ratio: &f%unranked_w/l_ratio%" - - "&8&m------------------------" - RANKED-LADDER-STATS: - NAME: "%ladder%" - LORE: - - "&8&m------------------------" - - "&eRanked Wins: &f%ranked_wins%" - - "&eRanked Losses: &f%ranked_losses%" - - "&eRanked W/L Ratio: &f%ranked_w/l_ratio%" - - "" - - "&eELO: &f%elo%" - - "&8&m------------------------" - UNRANKED-RANKED-STATS: - NAME: "%ladder%" - LORE: - - "&8&m------------------------" - - "&eUnranked Wins: &f%unranked_wins%" - - "&eUnranked Losses: &f%unranked_losses%" - - "&eUnranked W/L Ratio: &f%unranked_w/l_ratio%" - - "" - - "&eRanked Wins: &f%ranked_wins%" - - "&eRanked Losses: &f%ranked_losses%" - - "&eRanked W/L Ratio: &f%ranked_w/l_ratio%" - - "" - - "&eELO: &f%elo%" - - "" - - "&eOverall W/L Ratio: &f%overall_w/l_ratio%" - - "&eDivision: %division%" - - "&8&m------------------------" - PARTY: - PARTY-GAMES: - TITLE: "&8Party Games" - ICONS: - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - PARTY_SPLIT: - NAME: "&bSplit Fight" - MATERIAL: FIREWORK_CHARGE - PARTY_FFA: - NAME: "&aParty FFA" - MATERIAL: SLIME_BALL - PARTY-SETTINGS: - TITLE: "&8Party Settings" - ICONS: - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - PLAYER-LIMIT: - NAME: "&ePlayer Limit: &c%limit%" - MATERIAL: SKULL_ITEM - DAMAGE: 3 - LORE: - - "&8&m------------------------" - - "&7That many player can join" - - "&7your party maximum." - - "" - - "&a&lLEFT-CLICK &ato decrease the limit." - - "&b&lRIGHT-CLICK &bto increase the limit." - - "&8&m------------------------" - ACCESS-MODIFIERS: - PUBLIC: - NAME: "&ePublic: &aTrue" - MATERIAL: CHEST - LORE: - - "&8&m------------------------" - - "&7The party is &apublic" - - "&7anyone can join." - - "" - - "&e&lClick here &7to change the status." - - "&8&m------------------------" - PRIVATE: - NAME: "&ePublic: &cFalse" - MATERIAL: CHEST - LORE: - - "&8&m------------------------" - - "&7The party is &cprivate &7only" - - "&7players with invite can join." - - "" - - "&e&lClick here &7to change the status." - - "&8&m------------------------" - BROADCAST: - ENABLED: - NAME: "&eBroadcast Party: &aOn" - MATERIAL: PAPER - LORE: - - "&8&m------------------------" - - "&7The party is broadcasting" - - "&7to the players of the server." - - "" - - "&e&lClick here &7to &cturn off &7broadcasting." - - "&8&m------------------------" - DISABLED: - NAME: "&eBroadcast Party: &cOff" - MATERIAL: PAPER - LORE: - - "&8&m------------------------" - - "&7The party isn't broadcasting." - - "" - - "&e&lClick here &7to &aturn on &7broadcasting." - - "&8&m------------------------" - ALL-INVITE: - ENABLED: - NAME: "&eAll Invite: &aTrue" - MATERIAL: NAME_TAG - LORE: - - "&8&m------------------------" - - "&7Everyone can invite players" - - "&7to the party." - - "" - - "&e&lClick here &7to change the status." - - "&8&m------------------------" - DISABLED: - NAME: "&eAll Invite: &cFalse" - MATERIAL: NAME_TAG - LORE: - - "&8&m------------------------" - - "&7Only the party leader can invite" - - "&7players to the party." - - "" - - "&e&lClick here &7to change the status." - - "&8&m------------------------" - DUEL-REQUESTS: - ENABLED: - NAME: "&eDuel Requests: &aTrue" - MATERIAL: DIAMOND_SWORD - LORE: - - "&8&m------------------------" - - "&7Players can send duel requests" - - "&7to the party." - - "" - - "&e&lClick here &7to change the status." - - "&8&m------------------------" - DISABLED: - NAME: "&eDuel Requests: &cFalse" - MATERIAL: DIAMOND_SWORD - LORE: - - "&8&m------------------------" - - "&7Players can't send duel requests" - - "&7to the party." - - "" - - "&e&lClick here &7to change the status." - - "&8&m------------------------" - PARTY-CHAT: - ENABLED: - NAME: "&eParty Chat: &aOn" - MATERIAL: NOTE_BLOCK - LORE: - - "&8&m------------------------" - - "&7Party members can use" - - "&7the party chat." - - "" - - "&e&lClick here &7to &cturn off &7party chat." - - "&8&m------------------------" - DISABLED: - NAME: "&eParty Chat: &cOff" - MATERIAL: NOTE_BLOCK - LORE: - - "&8&m------------------------" - - "&7Party members can't use" - - "&7the party chat." - - "" - - "&e&lClick here &7to &aturn on &7party chat." - - "&8&m------------------------" - OTHER-PARTIES: - TITLE: "&8Other Parties" - ICONS: - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - PARTY-ITEM: - NAME: "&b%leader%'s Party &7(&f%partySize%&7)" - LORE: - MEMBER-FORMAT: " &7- &b%player%" - LORE: - - "&7&m------------------------" - - "%members%" - - "" - - "&f&lClick here &fto duel this party." - - "&7&m------------------------" - FFA: - LADDER-SELECTOR: - TITLE: "&8Select a &6ladder &8to join" - ICONS: - LADDER: - NAME: "%ladder%" - LORE: - - "" - - "&aClick here to select %ladder%&a." - FILLER: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 3 - DIVISION: - TITLE: "&8Division" - ICONS: - BACK-TO: - NAME: "&cBack to" - MATERIAL: ARROW - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - FILLER-ITEM2: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 3 - PAST-DIVISION: - NAME: "%fullName% &c(Past)" - LORE: - - "" - - " %color%┃ &fProgress: &a%progress_bar% &f(%progress_percent%%)" - - "" - - " &c┃ &fYou have passed this division." - CURRENT-DIVISION: - NAME: "%fullName% &a(Current)" - LORE: - - "" - - " %color%┃ &fProgress: &a%progress_bar% &f(%progress_percent%%)" - - "" - - " &c┃ &fThis is your current division." - NEXT-DIVISION: - NAME: "%fullName%" - LORE: - - "" - - " %color%┃ &fWins: %color%%current_wins%/%required_wins% &f(%win_progress_percent%%)" - - " %color%┃ &fElo: %color%%current_elo%/%required_elo% &f(%elo_progress_percent%%)" - - " %color%┃ &fExperience: %color%%current_exp%/%required_exp% &f(%exp_progress_percent%%)" - - "" - - " %color%┃ &fProgress: &a%progress_bar% &f(%progress_percent%%)" - - "" - PLAYER-SETTINGS: - TITLE: "&8Player Settings" # %player% - ICONS: - FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - DUEL-REQUEST: - ENABLED: - NAME: "&cToggle Duel Requests" - MATERIAL: DIAMOND_SWORD - LORE: - - "&8&m--------------------------------" - - "&7If enabled, player will be" - - "&7able to send you duel requests." - - "" - - " &a&l► &7Allow other players to duel you." - - " &7&l► &7Don't allow other players to duel you." - - "&8&m--------------------------------" - DISABLED: - NAME: "&cToggle Duel Requests" - MATERIAL: DIAMOND_SWORD - LORE: - - "&8&m--------------------------------" - - "&7If enabled, player will be" - - "&7able to send you duel requests." - - "" - - " &7&l► &7Allow other players to duel you." - - " &c&l► &7Don't allow other players to duel you." - - "&8&m--------------------------------" - SIDEBAR: - ENABLED: - NAME: "&6Toggle Scoreboard" - MATERIAL: PAINTING - LORE: - - "&8&m--------------------------------" - - "&7If enabled, you will be able" - - "&7to see the scoreboard." - - "" - - " &a&l► &7Show scoreboard." - - " &7&l► &7Hide scoreboard." - - "&8&m--------------------------------" - DISABLED: - NAME: "&6Toggle Scoreboard" - MATERIAL: PAINTING - LORE: - - "&8&m--------------------------------" - - "&7If enabled, you will be able" - - "&7to see the scoreboard." - - "" - - " &7&l► &7Show scoreboard." - - " &c&l► &7Hide scoreboard." - - "&8&m--------------------------------" - PARTY-INVITE: - ENABLED: - NAME: "&dParty Invite Requests" - MATERIAL: FEATHER - LORE: - - "&8&m--------------------------------" - - "&7If enabled, players will be able" - - "&7to send you party invites." - - "" - - " &a&l► &7Allow party leaders to invite you." - - " &7&l► &7Don't allow party leaders to invite you." - - "&8&m--------------------------------" - DISABLED: - NAME: "&dParty Invite Requests" - MATERIAL: FEATHER - LORE: - - "&8&m--------------------------------" - - "&7If enabled, players will be able" - - "&7to send you party invites." - - "" - - " &7&l► &7Allow party leaders to invite you." - - " &c&l► &7Don't allow party leaders to invite you." - - "&8&m--------------------------------" - PRIVATE-MESSAGE: - ENABLED: - NAME: "&9Private Messages" - MATERIAL: PAPER - LORE: - - "&8&m--------------------------------" - - "&7If enabled, players will be" - - "&7able to message you." - - "" - - " &a&l► &7Let players send messages to you." - - " &7&l► &7Don't let players send messages to you." - - "&8&m--------------------------------" - DISABLED: - NAME: "&9Private Messages" - MATERIAL: PAPER - LORE: - - "&8&m--------------------------------" - - "&7If enabled, players will be" - - "&7able to message you." - - "" - - " &7&l► &7Let players send messages to you." - - " &c&l► &7Don't let players send messages to you." - - "&8&m--------------------------------" - HIDE-PLAYERS: - ENABLED: - NAME: "&9Player Visibility" - MATERIAL: GHAST_TEAR - LORE: - - "&8&m--------------------------------" - - "&7If enabled, you will be able to" - - "&7see other players in the lobby." - - "" - - " &a&l► &7See players in the lobby." - - " &7&l► &7Don't see players in the lobby." - - "&8&m--------------------------------" - DISABLED: - NAME: "&9Player Visibility" - MATERIAL: GHAST_TEAR - LORE: - - "&8&m--------------------------------" - - "&7If enabled, you will be able to" - - "&7see other players in the lobby." - - "" - - " &7&l► &7See players in the lobby." - - " &c&l► &7Don't see players in the lobby." - - "&8&m--------------------------------" - ALLOW-SPECTATORS: - ENABLED: - NAME: "&7Allow Spectators" - MATERIAL: EMERALD - LORE: - - "&8&m--------------------------------" - - "&7If enabled, players can" - - "&7spectate your matches." - - "" - - " &a&l► &7Let players spectate your matches." - - " &7&l► &7Don't let players spectate your matches." - - "&8&m--------------------------------" - DISABLED: - NAME: "&7Allow Spectators" - MATERIAL: EMERALD - LORE: - - "&8&m--------------------------------" - - "&7If enabled, players can" - - "&7spectate your matches." - - "" - - " &7&l► &7Let players spectate your matches." - - " &c&l► &7Don't let players spectate your matches." - - "&8&m--------------------------------" - FLYING: - ENABLED: - NAME: "&7Flying" - MATERIAL: ENDER_PEARL - LORE: - - "&8&m--------------------------------" - - "&7If enabled, you can fly in the lobby." - - "" - - " &a&l► &7Enabled." - - " &7&l► &7Disabled." - - "&8&m--------------------------------" - DISABLED: - NAME: "&7Flying" - MATERIAL: ENDER_PEARL - LORE: - - "&8&m--------------------------------" - - "&7If enabled, you can fly in the lobby." - - "" - - " &7&l► &7Enabled." - - " &c&l► &7Disabled." - - "&8&m--------------------------------" - WORLD-TIME: - NAME: "&eWorld Time: &a%worldTime%" - MATERIAL: BLAZE_POWDER - LORE: - - "&8&m--------------------------------" - - "&7Click here to change time." - - "&8&m--------------------------------" - PLAYER-INFORMATION: # /prac info command - MAIN-PAGE: - TITLE: "&c%player%'s &8info" - ICONS: - REFRESH: - NAME: "&aRefresh Page" - MATERIAL: NETHER_STAR - LORE: - - "&8&m------------------------" - - "&7Click here to refresh the page." - - "&8&m------------------------" - BASIC-INFO: - NAME: "&6Basic Informations" - ONLINE-STATUS: "&aOnline" - LORE: - - "&8&m------------------------" - - "&eName: &7%player%" - - "&eUUID: &7%uuid%" - - "" - - "&eFirst Played: &7%first_played%" - - "&eLast Joined: &7%last_played%" - - "" - - "&eUnranked Left: &7%unranked_left%" - - "&eRanked Left: &7%ranked_left%" - - "" - - "&eDivision: &7%division_fullName%" - - "&8&m------------------------" - RANKED-BAN: - NAME: "&6%player% &7is banned from playing ranked." - MATERIAL: EMERALD - LORE: - - "&8&m------------------------" - - "&eBanner: &7%banner%" - - "&eReason: &7%reason%" - - "&eBanned at: &7%time%" - - "&8&m------------------------" - - "&aClick here &7to &eunban &7the player." - - "&8&m------------------------" - ONLINE-INFO: - PLAYER-OFFLINE: - NAME: "&cPlayer is not online!" - MATERIAL: FEATHER - PLAYER-ONLINE: - NAME: "&6Online Players Information's" - MATERIAL: FEATHER - LORE: - - "&8&m------------------------" - - "&eIn World: &7%world%" - - "&eGamemode: &7%gamemode%" - - "&eFlying: &7%flying%" - - "&eTablist Name: &7%tablist_name%" - - "&eHealth: &7%health%" - - "&eFood Level: &7%food%" - - "&eHit Delay: &7%hit_delay%" - - "&ePing: &7%ping%ms" - - "&8&m------------------------" - GAME: - OFFLINE: - NAME: "&cPlayer is offline" - MATERIAL: REDSTONE - IN-MATCH: - NAME: "&ePlayer is in a match." - MATERIAL: WATCH - LORE: - - "&8&m------------------------" - - "&eLeft-Click &7to start spectating the match." - - "&6Right-Click &7to get the player out of the match." - - "&8&m------------------------" - IN-EVENT: - NAME: "&ePlayer is in a event." - MATERIAL: WATCH - LORE: - - "&8&m------------------------" - - "&eLeft-Click &7to start spectating the event." - - "&6Right-Click &7to get the player out of the event." - - "&8&m------------------------" - IN-FFA: - NAME: "&ePlayer is in a FFA." - MATERIAL: WATCH - LORE: - - "&8&m------------------------" - - "&eLeft-Click &7to start spectating the FFA." - - "&6Right-Click &7to get the player out of the FFA." - - "&8&m------------------------" - SPECTATING: - NAME: "&ePlayer is spectating." - MATERIAL: WATCH - LORE: - - "&8&m------------------------" - - "&eLeft-Click &7to start spectating the same thing." - - "&6Right-Click &7to end the spectating." - - "&8&m------------------------" - NOTHING: - NAME: "&cPlayer does nothing" - MATERIAL: REDSTONE - LORE: - - "&8&m------------------------" - - "&7Player does not play in a" - - "&7match or event and does not" - - "&7spectate anything." - - "&8&m------------------------" - PARTY: - IN-PARTY: - NAME: "&aPlayer is in a party." - MATERIAL: NAME_TAG - NOT-IN-PARTY: - NAME: "&cPlayer is not in a party." - MATERIAL: NAME_TAG - STATISTICS: - NAME: "&cStatistics" - MATERIAL: FIREWORK_CHARGE - LORE: - - "&8&m------------------------" - - "&7Click here to view the" - - "&7player's statistics." - - "&8&m------------------------" - LADDER-STATS: - TITLE: "&8%player% ladder stats" - ICONS: - BACK-TO-HUB: - NAME: "&eBack to hub" - MATERIAL: ARROW - REFRESH: - NAME: "&aRefresh Page" - MATERIAL: NETHER_STAR - LORE: - - "&8&m------------------------" - - "&7Click here to refresh the page." - - "&8&m------------------------" - RESET-ALL-STATS: - NAME: "&cReset ALL Stats" - MATERIAL: GHAST_TEAR - LORE: - - "&8&m------------------------" - - "&7Click here to restart all" - - "&7the player's ladder statistics." - - "&8&m------------------------" - LADDER: - NULL-STAT: "&cN/A" - UNRANKED-LADDER-STATS: - NAME: "&e%ladder% ladder" - DEFAULT-MATERIAL: BEDROCK - LORE: - - "&8&m------------------------" - - "&eWins: &f%wins%" - - "&eLosses: &f%losses%" - - "" - - "&eCustom Kits: &f%custom_kits%" - - "&8&m------------------------" - - "&cClick here &7to reset the ladder stats." - - "&8&m------------------------" - RANKED-LADDER-STATS: - NAME: "&e%ladder% ladder" - DEFAULT-MATERIAL: BEDROCK - LORE: - - "&8&m------------------------" - - "&eUnranked Wins: &f%unranked_wins%" - - "&eUnranked Losses: &f%unranked_losses%" - - "&eUnranked Custom Kits: &f%unranked_custom_kits%" - - "" - - "&eRanked Wins: &f%ranked_wins%" - - "&eRanked Losses: &f%ranked_losses%" - - "&eRanked Custom Kits: &f%ranked_custom_kits%" - - "" - - "&eELO: &f%elo%" - - "&8&m------------------------" - - "&cClick here &7to reset the ladder stats." - - "&8&m------------------------" - SELECTORS: - ARENA-SELECTOR: - TITLE: "%matchType% &8- Arena" - ICONS: - BACK-TO-SELECTOR: - NAME: "&eBack to kit selector" - MATERIAL: ARROW - RANDOM-ARENA: - NAME: "&6Random Arena" - MATERIAL: NETHER_STAR - LORE: - - "&8&m------------------------" - - "&7Click here to pick a" - - "&erandom &7arena for the match." - - "&8&m------------------------" - ARENA-ICON: - NAME: "%arena%" - LORE: - - "&8&m------------------------" - - "&7Click here to select" - - "&7arena %arena%&7." - - "&8&m------------------------" - LADDER-SELECTOR: - TITLE: "%matchType% &8- Kit" - ICONS: - LADDER: - NAME: "%ladder%" - LORE: - - "&8&m------------------------" - - "&7Click here to select" - - "&7ladder %ladder%&7." - - "&8&m------------------------" - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - BASE-CUSTOM-PLAYER-KIT-ICON: - NAME: "&6Custom Kit" - MATERIAL: DIAMOND_SWORD - LORE: - - "&8&m------------------------" - - "&7Click here to play" - - "&7with your own custom kit." - - "&8&m------------------------" - EVENT-HOST: # You can set each event icon in the game. - TITLE: "&4Host Event" - LADDER-PREVIEW: - TITLE: "&8Preview of %ladder%" - ICONS: - NO-EFFECT: - NAME: "&5Ladder Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "&7This ladder has no effects." - - "&8&m------------------------" - HAS-EFFECT: - FORMAT: "&d%name% %amplifier% &7for %time%" - ICON: - NAME: "&5Ladder Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "&eYou will get these effects," - - "&ewhen the game starts." - - "" - - "%effects%" - - "&8&m------------------------" - MATCH-STATISTICS: - TITLE: - MULTIPLE-ROUND: "&8%player%'s Stat - R: %round%" - SINGLE-ROUND: "&8%player%'s Stat" - ICONS: - POTION: - NAME: "&cHealth Potions: &f%potion_left%" - MATERIAL: POTION - DAMAGE: 16421 - LORE: - - "&8&m--------------------" - - "&cPotions Thrown: &f%potion_thrown%" - - "&cPotions Missed: &f%potion_missed%" - - "&cPotion Accuracy: &f%potion_accuracy%" - - "&8&m--------------------" - HEALTH: - NAME: "&cHealth: &f20/%end_hearth% &c♥" - MATERIAL: SKULL_ITEM - HUNGER: - NAME: "&cHunger: &f20/%end_hunger%" - MATERIAL: COOKED_BEEF - EFFECT: - NO-EFFECT: - NAME: "&cPotion Effects" - MATERIAL: BREWING_STAND_ITEM - LORE: - - "&8&m------------------------" - - "&cPlayer didn't have any effects" - - "&cleft at the end of the game." - - "&8&m------------------------" - HAS-EFFECT: - FORMAT: " &f✱ &c%name% %amplifier% &7- &f %time%" - ICON: - NAME: "&cPotion Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "%effects%" - - "&8&m------------------------" - STATS: - NAME: "&cMatch Statistics" - MATERIAL: DIAMOND_SWORD - LORE: - - "&8&m------------------------" - - " &f✱ &cTotal Hits: &f%total_hits%" - - " &f✱ &cTotal Hits Received: &f%total_hits_received%" - - "" - - " &f✱ &cLongest Combo: &f%longest_combo%" - - " &f✱ &cAvarage CPS: &f%avarage_cps%" - - "&8&m------------------------" - VIEW-ROUND: - NAME: "&7&lClick-here &7to view your round &c%round% &7statstics." - MATERIAL: PAPER - PLAYER-INVENTORY: - TITLE: "&c%player%'s &8inventory" - ICONS: - FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - HEALTH: - NAME: "&cHealth: &f20/%health% &c♥" - MATERIAL: REDSTONE - HUNGER: - NAME: "&cHunger: &f20/%hunger%" - MATERIAL: COOKED_BEEF - EFFECT: - FORMAT: " &f✱ &c%name% %amplifier% &7- &f %time%" - ICON: - NAME: "&cPotion Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "%effects%" - - "&8&m------------------------" - UNRANKED-GUI: - LB-FORMAT: "&e%placement%# &f%player% &7» &f%score%" - FIRST-CATEGORY: - TITLE: "&9&lJoin %weight_class% Queue" - ICONS: - LADDER: - NAME: "%ladder%" - LORE: # Options: %elo%, %win%, %kills%, %deaths%, %win_streak%, %best_win_streak%, %lose_streak%, %best_lose_streak% - - " &c&l» &eUnranked" - - " &fFighting: &e%in_fight%" - - " &fQueueing: &e%in_queue%" - - "" - - "&eWinstreak Top 3" - - "%lb_win_streak_1%" - - "%lb_win_streak_2%" - - "%lb_win_streak_3%" - - "" - - "&eClick here to join the %weight_class% %ladder% &equeue." - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - GO-TO-SECOND-CATEGORY: - NAME: "&9&lNext Page" - MATERIAL: ARROW - SECOND-CATEGORY: - TITLE: "&9&lJoin %weight_class% Queue" - ICONS: - LADDER: - NAME: "%ladder%" - LORE: # Options: %elo%, %win%, %kills%, %deaths%, %win_streak%, %best_win_streak%, %lose_streak%, %best_lose_streak% - - " &c&l» &eUnranked" - - " &fFighting: &e%in_fight%" - - " &fQueueing: &e%in_queue%" - - "" - - "&eWinstreak Top 3" - - "%lb_win_streak_1%" - - "%lb_win_streak_2%" - - "%lb_win_streak_3%" - - "" - - "&eClick here to join the %weight_class% %ladder% &equeue." - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - GO-BACK-TO-FIRST-CATEGORY: - NAME: "&9&lPrevious Page" - MATERIAL: ARROW - ICONS: - FROZEN-LADDER-ITEM: # You can set different material and damage for this item. - NAME: "%ladder%" - LORE: - - "" - - "&eThis ladder is &bfrozen&e." - DISABLED-LADDER-ITEM: # You can set different material and damage for this item. - NAME: "%ladder%" - LORE: - - "" - - "&eThis ladder is &cdisabled&e." - RANKED-GUI: - LB-FORMAT: "&e%placement%# &f%player% &7» &f%score%" - FIRST-CATEGORY: - TITLE: "&4&lJoin %weight_class% Queue" - ICONS: - LADDER: - NAME: "%ladder%" - LORE: # Options: %elo%, %win%, %kills%, %deaths%, %win_streak%, %best_win_streak%, %lose_streak%, %best_lose_streak% - - " &c&l» &cRanked" - - " &fFighting: &e%in_fight%" - - " &fQueueing: &e%in_queue%" - - "" - - "&eElo Top 3" - - "%lb_elo_1%" - - "%lb_elo_2%" - - "%lb_elo_3%" - - "" - - "&eClick here to join the %weight_class% %ladder% &equeue." - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - GO-TO-SECOND-CATEGORY: - NAME: "&9&lNext Page" - MATERIAL: ARROW - SECOND-CATEGORY: - TITLE: "&4&lJoin %weight_class% Queue" - ICONS: - LADDER: - NAME: "%ladder%" - LORE: # Options: %elo%, %win%, %kills%, %deaths%, %win_streak%, %best_win_streak%, %lose_streak%, %best_lose_streak% - - " &c&l» &cRanked" - - " &fFighting: &e%in_fight%" - - " &fQueueing: &e%in_queue%" - - "" - - "&eWinstreak Top 3" - - "%lb_win_streak_1%" - - "%lb_win_streak_2%" - - "%lb_win_streak_3%" - - "" - - "&eClick here to join the %weight_class% %ladder% &equeue." - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - GO-BACK-TO-FIRST-CATEGORY: - NAME: "&9&lPrevious Page" - MATERIAL: ARROW - ICONS: - FROZEN-LADDER-ITEM: # You can set different material and damage for this item. - NAME: "%ladder%" - LORE: - - "" - - "&eThis ladder is &bfrozen&e." - DISABLED-LADDER-ITEM: # You can set different material and damage for this item. - NAME: "%ladder%" - LORE: - - "" - - "&eThis ladder is &cdisabled&e." - SPECTATOR-MENU: - TITLE: "&8Spectator Menu - Page %page%" - ICONS: - PAGE-LEFT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - CLOSE: - NAME: "&cClose Spectator Menu" - MATERIAL: ARROW - PAGE-RIGHT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - MATCH-ICON: - NAME: "%match_type%" - LORE: - - "&8#%match_id%" - - "%weight_class%" - - "" - - "&eMatch Type: &f%match_type%" - - "&eKit: &f%ladder%" - - "&eArena: &f%arena%" - - "&eRound: &f%round%" - - "&eDuration: &f%roundDuration%" - - "&eSpectators: &f%spectators%" - - "" - - "&a» Click to spectate «" - EVENT-ICON: - NAME: "&e%event_type%" - LORE: - - "&eDuration: &f%event_duration%" - - "&ePlayers: &f%players%" - - "&eSpectators: &f%spectators%" - - "" - - "&a» Click to spectate «" - FFA-ICON: - BUILD-STATUS: - ENABLED: "&aEnabled" - DISABLED: "&cDisabled" - NAME: "&6FFA" - LORE: - - "&eBuild: &f%build_status%" - - "&eArena: &f%arena%" - - "&ePlayers: &f%players%" - - "&eSpectators: &f%spectators%" - - "" - - "&a» Click to spectate «" - SETUP: - HUB: - TITLE: "&cServer Manager" - ICONS: - GENERAL-FILLER-ITEM: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 1 - ARENA-MANAGER: - NAME: "&6Arena Manager" - MATERIAL: NETHER_STAR - LADDER-MANAGER: - NAME: "&eLadder Manager" - MATERIAL: GOLD_SWORD - HOLOGRAM-MANAGER: - NAME: "&bHologram Manager" - MATERIAL: PAPER - EVENT-MANAGER: - NAME: "&2Event Manager" - MATERIAL: IRON_HELMET - SERVER-MANAGER: - NAME: "&cServer Manager" - MATERIAL: NAME_TAG - FFA-ARENA: - MAIN: - TITLE: "&9%arenaName% &8- Arena" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - DELETE: - NAME: "&cDelete Arena" - MATERIAL: INK_SACK - DAMAGE: 1 - ARENA-NAME: - NAME: "&6%arenaDisplayName%" - MATERIAL: BEDROCK - LORE: - - "" - - "&eArena Type: &b%arenaType%" - - "" - - "&e&lLeft-Click here &7to get detailed information." - - "&6&lRight-Click here &7to get a setup item for the arena." - - "" - - "&7You can set the arenas icon by using the" - - "&7&l/arena set icon %arenaName% &7command." - - "" - - "&c&lNote: &7You have to hold the item in your hand" - - "&7and name it first with the &7&l/prac rename &7command." - SETTINGS: - NAME: "&5Settings" - MATERIAL: REDSTONE - LORE: - - "" - - "&e&lClick here &7to open the settings gui." - - "" - - "&c&lNote: &7You can change the build setting," - - "&7re-kit after kill setting and the lobby after" - - "&7death setting." - STATUS: - ENABLED: - NAME: "&7Status: &aEnabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&e&lClick here &7to &cdisable &7the arena." - - "" - - "&c&lNote: &7This will remove all the" - - "&7players from the arena." - DISABLED: - NAME: "&7Status: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&e&lClick here &7to &aenable &7the arena." - - "" - - "&c&lNote: &7The arena has to meet some" - - "&7requirements to be enable:" - - " &8» &eMark all the corners." - - " &8» &eAdd spawn positions." - - " &8» &eSet an icon." - LOCATION: - NAME: "&5Locations" - MATERIAL: COMPASS - LORE: - - "" - - "&5&lCurrently Marked:" - - " &5» &dCorner 1: &7%corner1%" - - " &5» &dCorner 2: &7%corner2%" - - "" - - " &5» &dSpawn Positions: &7%ffa_pos_num%" - LADDER: - NAME: "&cLadder Types" - MATERIAL: GOLD_SWORD - LORE: - - "" - - "&e&lClick here &7to open the ladder assign gui." - - "" - - "&c&lNote: &7You can only assign basic or build" - - "&7ladders to your FFA arena depending on the arenas" - - "&7build setting." - - "" - - "&c&lNote: &7You have to assign at least" - - "&7one ladder before enabling." - OPEN-STATUS: - OPEN: - NAME: "&7The &eFFA &7is currently &aopen" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&7This means that players can join" - - "&7and play in the arena." - - "" - - "&e&lClick here &7to &cCLOSE &7the arena." - - "" - - "&c&lNote: &7This will remove all the" - - "&7players from the arena." - CLOSE: - NAME: "&7The &eFFA &7is currently &cclosed" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&e&lClick here &7to &aOPEN &7the arena." - - "" - - "&c&lNote: &7The arena has to be enabled." - SETTINGS: - TITLE: "&4%arenaName% &8- Settings" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - FILLER: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - BUILD: - ENABLED: - NAME: "&7Build: &aEnabled" - MATERIAL: IRON_PICKAXE - LORE: - - "" - - "&e&lClick here &7to &cdisable &7the" - - "&2building &7in the arena." - - "" - - "&c&lNote: &7This will remove all the" - - "&7assigned ladders from the arena." - DISABLED: - NAME: "&7Build: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&e&lClick here &7to &aenable &7the" - - "&2building &7in the arena." - - "" - - "&c&lNote: &7This will remove all the" - - "&7assigned ladders from the arena." - RE-KIT-AFTER-KILL: - ENABLED: - NAME: "&7Re-Kit After Kill: &aEnabled" - MATERIAL: DIAMOND_SWORD - LORE: - - "" - - "&eAfter a player kills somebody" - - "ðey get a new kit." - - "" - - "&e&lClick here &7to &cdisable &7the" - - "&2re-kit after kill &7in the arena." - DISABLED: - NAME: "&7Re-Kit After Kill: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&eAfter a player kills somebody" - - "ðey get a new kit." - - "" - - "&e&lClick here &7to &aenable &7the" - - "&2re-kit after kill &7in the arena." - LOBBY-AFTER-DEATH: - ENABLED: - NAME: "&7Lobby After Death: &aEnabled" - MATERIAL: DIAMOND_SWORD - LORE: - - "" - - "&eAfter a player dies they get" - - "&eteleported back to the arena." - - "" - - "&e&lClick here &7to &cdisable &7the" - - "&2lobby after death &7setting in the arena." - DISABLED: - NAME: "&7Lobby After Death: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&eAfter a player dies they get" - - "&eteleported back to the arena." - - "" - - "&e&lClick here &7to &aenable &7the" - - "&2lobby after death &7setting in the arena." - ARENA-LADDERS-SINGLE: - TITLE: "&4%arenaName% &8- Ladders" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - LADDER-ICONS: - ASSIGNED: - NAME: "&a%ladderDisplayName%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&7This ladder is &aassigned&7 for the arena." - - "" - - "&eClick here &7to &cunassign&7." - NOT-ASSIGNED: - NAME: "&c%ladderDisplayName%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&7This ladder is &cunassigned&7 for the arena." - - "" - - "&eClick here &7to &aassign&7." - DISABLED: - NAME: "&7%ladderDisplayName%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - LORE: - - "" - - "&7This ladder or it's ladder type" - - "&7is currently &cdisabled&7." - ARENA: - ARENA-MANAGER: - TITLE: "&8Arena Manager - Page %page%" - ICONS: - PAGE-LEFT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - PAGE-RIGHT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - ARENA-ICON: - STATUS-NAMES: - ENABLED: "&aEnabled" - DISABLED: "&cDisabled" - BUILD: - NAME: "&6%arenaName%" - MATERIAL: BEDROCK - LORE: - - "" - - "&6Arena Information:" - - " &7» &eType: &b%type%" - - " &7» &eState: &b%state%" - - " &7» &eCopies: &7%copies%/64" - - " &7» &eLadders: &7%assigned_ladders%/%assignable_ladders%" - - "" - - "&a&lLeft-Click &ato open arena settings." - - "&b&lRight-Click &bto to teleport to arena." - NON-BUILD: - NAME: "&6%arenaName%" - MATERIAL: BEDROCK - LORE: - - "" - - "&6Arena Information:" - - " &7» &eType: &b%type%" - - " &7» &eState: &b%state%" - - " &7» &eLadders: &7%assigned_ladders%/%assignable_ladders%" - - "" - - "&a&lLeft-Click &ato open arena settings." - - "&b&lRight-Click &bto to teleport to arena." - FFA: - NAME: "&6%arenaName%" - MATERIAL: BEDROCK - LORE: - - "" - - "&6Arena Information:" - - " &7» &eType: &bFFA" - - " &7» &eState: &b%state%" - - " &7» &eBuild: &b%build%" - - "" - - "&a&lLeft-Click &ato open arena settings." - - "&b&lRight-Click &bto to teleport to arena." - ARENA-MAIN: - TITLE: "&4%arenaName% &8- Arena" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - DELETE: - NAME: "&cDelete Arena" - MATERIAL: INK_SACK - DAMAGE: 1 - ARENA-NAME: - NAME: "&6%arenaDisplayName%" - MATERIAL: BEDROCK - LORE: - - "" - - "&eArena Type: &b%arenaType%" - - "" - - "&e&lLeft-Click here &7to get detailed information." - - "&6&lRight-Click here &7to get a setup item for the arena." - - "" - - "&7You can set the arenas icon by using the" - - "&7&l/arena seticon %arenaName% &7command." - - "&c&lNote: &7You have to hold the item in your hand" - - "&7and name it first with the &7&l/prac rename &7command." - STATUS: - ENABLED: - NAME: "&7Status: &aEnabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&e&lClick here &7to &cdisable &7the arena." - DISABLED: - NAME: "&7Status: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&e&lClick here &7to &aenable &7the arena." - - "" - - "&c&lNote: &7The arena has to meet some" - - "&7requirements to be enable:" - - " &8» &eMark all the corners." - - " &8» &eSet all the positions." - - " &8» &eSet an icon." - LOCATION: - BUILD: - NAME: "&5Locations" - MATERIAL: COMPASS - LORE: - - "" - - "&5&lCurrently Marked:" - - " &5» &dCorner 1: &7%corner1%" - - " &5» &dCorner 2: &7%corner2%" - - "" - - " &5» &dSide Build Limit: &7%sideBuildLimit%" - - " &5» &dBuild Max Y: &7%buildMaxY%" - - " &5» &dDeath Zone Y: &7%deathZoneY%" - - "" - - " &5» &dPlayer 1 Position: &7%position1%" - - " &5» &dPlayer 2 Position: &7%position2%" - - "" - - " &5» &dBed 1: &7%bed1%" - - " &5» &dBed 2: &7%bed2%" - - " &5» &dPortal 1: &7%portal1%" - - " &5» &dPortal 2: &7%portal2%" - NOT-BUILD: - NAME: "&5Locations" - MATERIAL: COMPASS - LORE: - - "" - - "&5&lCurrently Marked:" - - " &5» &dCorner 1: &7%corner1%" - - " &5» &dCorner 2: &7%corner2%" - - "" - - " &5» &dDeath Zone Y: &7%deathZoneY%" - - "" - - " &5» &dPlayer 1 Position: &7%position1%" - - " &5» &dPlayer 2 Position: &7%position2%" - LADDER: - NAME: "&cLadder Types" - MATERIAL: GOLD_SWORD - LORE: - - "" - - "&e&lClick here &7to open the ladder type setup gui." - - "" - - "&c&lNote: &7You won't be able to enable" - - "&7non-build ladders for build arenas and vice versa." - - "" - - "&c&lNote: &7You have to add at least" - - "&7one ladder before enabling." - COPIES: - NAME: "&eArena Copies" - MATERIAL: HOPPER - LORE: - - "" - - "&e&lClick here &7to complete the following" - - "&7tasks with the arena copies:" - - " &8» &7Create" - - " &8» &7Delete" - - " &8» &7Look through" - - " &8» &7Teleport" - FREEZE: - FROZEN: - NAME: "&eThe arena is &bfrozen&e." - MATERIAL: SNOW_BALL - LORE: - - "" - - "&7Click here to &adefrost&7." - - "" - - "&7The players will be able to" - - "&7play in this arena again." - NOT-FROZEN: - NAME: "&eThe arena is &anot frozen&e." - MATERIAL: DOUBLE_PLANT - LORE: - - "" - - "&eClick here to &bfreeze &eit." - - "" - - "&7This means that the players won't be" - - "&7able to start a new match in this arena." - ARENA-COPY: - TITLE: "&4%arenaName% &8- Copies, Page %page%" - ICONS: - NAV-MAIN: - NAME: "&c%arenaDisplayName% &7Arena Copies Manager" - MATERIAL: REDSTONE - LORE: - - "" - - "&7Copies: &e%copies%&7/64" - - "" - - "&cNote: &7You can't change anything in the" - - "&7copies, nor the arena, if it has copies." - COPY-ARENA: - NAME: "&c%arenaDisplayName% &7(&e%copyNumber%&7)" - MATERIAL: HOPPER - LORE: - - "" - - "&e&lClick here &7to teleport to the copy arena." - PAGE-LEFT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - PAGE-RIGHT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - DELETE: - NAME: "&eClick here to &cdelete ðe &6last &ecopy." - MATERIAL: ARROW - GENERATE: - NAME: "&eClick here to &agenerate &ea &6new &ecopy." - MATERIAL: ARROW - ARENA-LADDERS-TYPE: - TITLE: "&4%arenaName% &8- Ladders" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - GO-TO-LADDERS: - NAME: "&cLadders" - MATERIAL: GOLDEN_CARROT - LORE: - - "" - - "&e&lClick here &7to open the ladder setup gui." - - "" - - "&c&lNote: &7The plugin automatically assign" - - "&7every ladder of which type is enabled." - LADDER-TYPE-ICONS: - ENABLED: - NAME: "&a%ladderTypeName%" - LORE: - - "" - - "&7Ladder type is &aenabled&7." - - "" - - "&eClick here &7to &cdisable &7it." - DISABLED: - NAME: "&c%ladderTypeName%" - LORE: - - "" - - "&7Ladder type is &cdisabled&7." - - "" - - "&eClick here &7to &aenable &7it." - CUSTOM-KIT-ICONS: - ICON: - NAME: "&eCustom Kit: %status%" - MATERIAL: ARROW - LORE: - - "" - - "&7This setting decides if the players" - - "&7can use their custom kits in this arena." - ARENA-LADDERS-SINGLE: - TITLE: "&4%arenaName% &8- Ladders" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - LADDER-ICONS: - ASSIGNED: - NAME: "&a%ladderDisplayName%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&7This ladder is &aassigned&7 for the arena." - - "" - - "&eClick here &7to &cunassign&7." - NOT-ASSIGNED: - NAME: "&c%ladderDisplayName%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&7This ladder is &cunassigned&7 for the arena." - - "" - - "&eClick here &7to &aassign&7." - DISABLED: - NAME: "&7%ladderDisplayName%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - LORE: - - "" - - "&7This ladder or it's ladder type" - - "&7is currently &cdisabled&7." - NOT-COMPATIBLE: - NAME: "&7%ladderDisplayName%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - LORE: - - "" - - "&7This ladder is &cnot compatible" - - "&7with the arena because of the" - - "&7build status." - LADDER: - LADDER-MANAGER: - TITLE: "&8Ladder Manager" - ICONS: - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - LADDER-ICON: - STATUS-NAMES: - ENABLED: "&aEnabled" - DISABLED: "&cDisabled" - NAME: "&6%ladder%" - MATERIAL: BEDROCK - LORE: - - "" - - "&6Ladder Information:" - - " &7» &eType: &b%type%" - - " &7» &eState: %ladderState%" - - " &7» &eRanked: %rankedState%" - - " &7» &eFreeze: %freezeState%" - - "" - - "&b&lClick here &bto open ladder settings." - LADDER-MAIN: - TITLE: "&1%ladder% &8- Ladder" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - LADDER-NAME: - NAME: "&6%ladder%" - MATERIAL: BEDROCK - LORE: - - "" - - "&eLadder Type: &b%type%" - - "" - - "&7You can set the ladders icon by using the" - - "&7&l/ladder seticon %ladder% &7command." - - "" - - "&b&lNote: &7You have to hold the item in your hand and" - - "&7you have to name it first with the &l/prac rename &7command." - STATUS: - ENABLED: - NAME: "&7Status: &aEnabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&e&lClick here &7to &cdisable &7the ladder." - - "" - - "&c&lNote: &cThis will delete all the players" - - "&ccustom kits with this ladder." - - "&c&lYou won't be able to reverse this action." - DISABLED: - NAME: "&7Status: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&e&lClick here &7to &aenable &7the ladder." - - "" - - "&c&lNote: &7The ladder has to meet some" - - "&7requirements to be enable:" - - " &8» &eSet an icon." - - " &8» &eSet the inventory." - FREEZE: - FROZEN: - NAME: "&eThe ladder is &bfrozen&e." - MATERIAL: SNOW_BALL - LORE: - - "" - - "&7Click here to &adefrost&7." - - "" - - "&7The players will be able to edit" - - "&7and play with this ladder again." - NOT-FROZEN: - NAME: "&eThe ladder is &anot frozen&e." - MATERIAL: DOUBLE_PLANT - LORE: - - "" - - "&eClick here to &bfreeze &eit." - - "" - - "&7This means that the players" - - "&7won't be able to start a new match" - - "&7and edit this ladder." - INVENTORY: - NAME: "&3Inventory & Armor" - MATERIAL: DIAMOND_CHESTPLATE - LORE: - - "" - - "&b&lClick here &7to edit the inventory" - - "&7and armor content of the ladder." - - "&7You can also view the added effects as well." - DESTROYABLE-BLOCKS: - NAME: "&cDestroyable Blocks" - MATERIAL: ENDER_STONE - LORE: - - "" - - "&c&lClick here &7to edit the blocks" - - "&7that can be destroyed during the game" - - "&7and are already placed in the arena." - SETTINGS: - NAME: "&4Settings" - MATERIAL: REDSTONE - LORE: - - "" - - "&e&lClick here &7to adjust the ladders" - - "&7other settings, such as:" - - " &8» &cRounds" - - " &8» &cRanked" - - " &8» &cPlayer Regeneration" - - " &8» &cPlayer Hunger" - - " &cetc..." - MATCH-TYPE: - NAME: "&6Match Types" - MATERIAL: BOOK - LORE: - - "" - - "&6&lClick here &7to set which" - - "&7match types should be available" - - "&7for the ladder." - DELETE: - NAME: "&cDelete Ladder" - MATERIAL: INK_SACK - DAMAGE: 1 - SETTINGS: - TITLE: "&1%ladder% &8- Settings" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - REGENERATION: - ENABLED: - NAME: "&7Regeneration: &aEnabled" - MATERIAL: GLOWSTONE_DUST - LORE: - - "" - - "&7Players health is automatically regenerate (normally)." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Regeneration: &cDisabled" - MATERIAL: GLOWSTONE_DUST - LORE: - - "" - - "&7Players health is not regenerate." - - "" - - "&e&lClick here &7to &aenable&7." - HUNGER: - ENABLED: - NAME: "&7Hunger: &aEnabled" - MATERIAL: COOKED_BEEF - LORE: - - "" - - "&7Players starve during the game." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Hunger: &cDisabled" - MATERIAL: COOKED_BEEF - LORE: - - "" - - "&7Players don't starve." - - "" - - "&e&lClick here &7to &aenable&7." - ROUNDS: - NAME: "&7Rounds: &6%rounds%" - MATERIAL: FIREWORK_CHARGE - LORE: - - "" - - "&7The first player/team to reach" - - "&7the, winning rounds wins." - - "" - - "&a&lLEFT-CLICK &ato reduce the rounds." - - "&b&lRIGHT-CLICK &bto increase the rounds." - KNOCKBACK: - NAME: "&eKnockback Modifier" - MATERIAL: STICK - LORE: - - "" - - "%knockbackTypes%" - - "" - - "&c&lNote: &7Default won't change the knockback." - - "&7You can change the normal and combo knockbacks" - - "&7in the config file." - HITDELAY: - NAME: "&7Hitdelay: &6%hitdelay% tick" - MATERIAL: DIAMOND_SWORD - LORE: - - "" - - "&7Players can hit each other" - - "&7at these intervals." - - "" - - "&c&lNote: &71 sec = 20 tick" - - "" - - "&a&lLEFT-CLICK &ato reduce the rounds." - - "&b&lRIGHT-CLICK &bto increase the rounds." - MAX-DURATION: - NAME: "&7Max Duration: &6%maxDuration% sec" - MATERIAL: WATCH - LORE: - - "" - - "&7The maximum time the match can last." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - TNT-FUSE-TIME: - NAME: "&7TNT Fuse Time: &6%tntFuseTime% sec" - MATERIAL: TNT - LORE: - - "" - - "&7The time until the tnt explodes." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - EDITABLE: - ENABLED: - NAME: "&7Editable: &aEnabled" - MATERIAL: BOOK - LORE: - - "" - - "&7Players can customize the ladder." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Editable: &cDisabled" - MATERIAL: BOOK - LORE: - - "" - - "&7Players can't customize the ladder." - - "" - - "&e&lClick here &7to &aenable&7." - WEIGHT-CLASS: - NAME: "&eWeight Class Selector" - MATERIAL: DOUBLE_PLANT - LORE: - - "" - - "%weightClassTypes%" - START-COUNTDOWN: - NAME: "&7Start Countdown: &6%startCountdown%" - MATERIAL: WATCH - LORE: - - "" - - "&7When the match/round starts the server" - - "&7counts down this amount of time." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - START-MOVING: - ENABLED: - NAME: "&7Start moving: &aEnabled" - MATERIAL: DIRT - LORE: - - "" - - "&7Players can move during" - - "&7round start countdown." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Start moving: &cDisabled" - MATERIAL: DIRT - LORE: - - "" - - "&7Players can't move during" - - "&7round start countdown." - - "" - - "&e&lClick here &7to &aenable&7." - HEALTH-BELOW-NAME: - ENABLED: - NAME: "&7Health Below Name: &aEnabled" - MATERIAL: INK_SACK - DAMAGE: 1 - LORE: - - "" - - "&7Players will display their hearts" - - "&7during the match." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Health Below Name: &cDisabled" - MATERIAL: INK_SACK - DAMAGE: 1 - LORE: - - "" - - "&7Players will display their hearts" - - "&7during the match." - - "" - - "&e&lClick here &7to &aenable&7." - RESET-BUILD-AFTER-ROUND: - ENABLED: - NAME: "&7Reset Build After Round: &aEnabled" - MATERIAL: GRASS - LORE: - - "" - - "&7The arena will be reset after each" - - "&7round, before the next one starts." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Reset Build After Round: &cDisabled" - MATERIAL: GRASS - LORE: - - "" - - "&7The arena will not be reset between" - - "&7rounds. Placed blocks persist." - - "" - - "&e&lClick here &7to &aenable&7." - BREAK-ALL-BLOCKS: - ENABLED: - NAME: "&7Break All Blocks: &aEnabled" - MATERIAL: DIAMOND_PICKAXE - LORE: - - "" - - "&7Players can break any block in the arena," - - "&7not just blocks they placed themselves." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Break All Blocks: &cDisabled" - MATERIAL: WOOD_PICKAXE - LORE: - - "" - - "&7Players can only break blocks they" - - "&7placed during the match." - - "" - - "&e&lClick here &7to &aenable&7." - FIREBALL-BLOCK-DESTROY: - ENABLED: - NAME: "&7Fireball Block Destroy: &aEnabled" - MATERIAL: FIREBALL - LORE: - - "" - - "&7Fireball explosions will destroy" - - "&7blocks placed by players." - - "&8(Arena blocks are not affected)" - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Fireball Block Destroy: &cDisabled" - MATERIAL: FIREBALL - LORE: - - "" - - "&7Fireball explosions will not" - - "&7destroy any blocks." - - "" - - "&e&lClick here &7to &aenable&7." - SPLEEF-SNOWBALL-MODE: - ENABLED: - NAME: "&7Snowball Mode: &aEnabled" - MATERIAL: SNOW_BALL - LORE: - - "" - - "&7Breaking a snow block gives a snowball." - - "&7Throw snowballs to destroy snow blocks" - - "&7beneath other players." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Snowball Mode: &cDisabled" - MATERIAL: SNOW_BALL - LORE: - - "" - - "&7Enable to let players collect and throw" - - "&7snowballs that destroy snow blocks." - - "" - - "&e&lClick here &7to &aenable&7." - ENDERPEARL-COOLDOWN: - NAME: "&7EnderPearl Cooldown: &6%epCooldown% sec" - MATERIAL: ENDER_PEARL - LORE: - - "" - - "&7Players must wait this long before" - - "&7they can throw the next enderpearl." - - "" - - "&a&lLEFT-CLICK &ato reduce the cooldown." - - "&b&lRIGHT-CLICK &bto increase the cooldown." - GOLDENAPPLE-COOLDOWN: - NAME: "&7Golden Apple Cooldown: &6%golden_apple_cooldown%" - MATERIAL: GOLDEN_APPLE - LORE: - - "" - - "&7Players must wait this long before" - - "&7they can consume the next golden apple." - - "" - - "&7This setting includes both enchanted" - - "&7and non-enchanted golden apples." - - "" - - "&a&lLEFT-CLICK &ato reduce the cooldown." - - "&b&lRIGHT-CLICK &bto increase the cooldown." - DROP-INVENTORY-PARTY-GAMES: - ENABLED: - NAME: "&7Drop Inventory: &aEnabled" - MATERIAL: GHAST_TEAR - LORE: - - "" - - "&7When several players are playing a" - - "&7party match and someone dies, should" - - "&7the inventory be dropped out or not." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Drop Inventory: &cDisabled" - MATERIAL: GHAST_TEAR - LORE: - - "" - - "&7When several players are playing a" - - "&7party match and someone dies, should" - - "&7the inventory be dropped out or not." - - "" - - "&e&lClick here &7to &aenable&7." - MULTI-ROUND-START-COUNTDOWN: - ENABLED: - NAME: "&7Multi Round Start Countdown: &aEnabled" - MATERIAL: QUARTZ - LORE: - - "" - - "&7If a ladder has several rounds," - - "&7you have the option to turn off" - - "&7the start counter before the" - - "&7round with this setting." - - "" - - "&c&lNote: &7At the start of the match," - - "&7the counter will work the same way." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Multi Round Start Countdown: &cDisabled" - MATERIAL: QUARTZ - LORE: - - "" - - "&7If a ladder has several rounds," - - "&7you have the option to turn off" - - "&7the start counter before the" - - "&7round with this setting." - - "" - - "&c&lNote: &7At the start of the match," - - "&7the counter will work the same way." - - "" - - "&e&lClick here &7to &aenable&7." - SKYWARS: - NAME: "&6SkyWars Chest Loot" - MATERIAL: CHEST - LORE: - - "" - - "&e&lClick here &7to edit the" - - "&7loot which the players get when" - - "&7they open chests during the game." - TEMP-BUILD: - NAME: "&7Temp Build delay: &6%tempBuildDelay% sec" - MATERIAL: MELON_BLOCK - LORE: - - "" - - "&7All blocks placed during the match." - - "&7will disappear after this time" - - "" - - "&a&lLEFT-CLICK &ato reduce the delay." - - "&b&lRIGHT-CLICK &bto increase the delay." - BOXING: - NAME: "&7Boxing Strokes to Win: &6%boxingWinHits%" - MATERIAL: LEVER - LORE: - - "" - - "&7A player or team wins if they have" - - "&7gained that many strokes." - - "&7In a team match, player's" - - "&7strokes are added together." - - "" - - "&a&lLEFT-CLICK &ato reduce the strokes." - - "&b&lRIGHT-CLICK &bto increase the strokes." - RESPAWN: - NAME: "&7Respawn Time: &6%respawnTime%" - MATERIAL: BED - LORE: - - "" - - "&7That's how long it takes" - - "&7for a player to come back to life" - - "&7when he dies without his bed being broken" - - "&7or when the ladder type is battle rush / bridges." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - FIREBALL-COOLDOWN: - NAME: "&7Fireball Cooldown: &6%cooldown% sec" - MATERIAL: FIREBALL - LORE: - - "" - - "&7Players must wait this long before" - - "&7they throw another fireball." - - "" - - "&a&lLEFT-CLICK &ato reduce the cooldown." - - "&b&lRIGHT-CLICK &bto increase the cooldown." - INVENTORY: - TITLE: "&1%ladder% &8- Inventory" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - CUSTOM-KIT-EDITOR: - EDITABLE: - NAME: "&6Custom Kit &7Editor" - MATERIAL: BOOK - LORE: - - "" - - "&6&lClick here &7to customize" - - "&7what extra items the players" - - "&7can add to the custom kit." - NOT-EDITABLE: - NAME: "&6Custom Kit &7Editor" - MATERIAL: BOOK - LORE: - - "" - - "&cThis ladder is not editable" - - "&cby the players." - EFFECTS: - HAS-EFFECT: - EFFECT-FORMAT: "&d%name% %amplifier% &7for %time%" - NAME: "&5Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "&c&lNote: &7You can set the effects by using" - - "&7the &7&l/ladder seteffects %ladder% &7command." - - "" - - "&aCurrently set effects:" - - "%effects%" - - "&8&m------------------------" - NO-EFFECT: - NAME: "&5Effects" - MATERIAL: POTION - DAMAGE: 8233 - LORE: - - "&8&m------------------------" - - "&7This ladder has no effects." - - "&8&m------------------------" - DESTROYABLE-BLOCKS: - TITLE: "&1%ladder% &8- D-Blocks" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - CUSTOM-KIT: - TITLE: "&1%ladder% &8- Custom Kit" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - SAVE: - NAME: "&a&lSave" - MATERIAL: WOOL - DAMAGE: 5 - LORE: - - "" - - "&cThis is just a showcase item, which" - - "&ccurrently has no functionality, but" - - "&cit demonstrates how the kit editor will look like." - LOAD: - NAME: "&e&lLoad default kit" - MATERIAL: WOOL - DAMAGE: 4 - LORE: - - "" - - "&cThis is just a showcase item, which" - - "&ccurrently has no functionality, but" - - "&cit demonstrates how the kit editor will look like." - CANCEL: - NAME: "&c&lCancel" - MATERIAL: WOOL - DAMAGE: 14 - LORE: - - "" - - "&cThis is just a showcase item, which" - - "&ccurrently has no functionality, but" - - "&cit demonstrates how the kit editor will look like." - SWITCH-WEIGHTCLASS: - ONLY-UNRANKED: - NAME: "&cThis ladder is only %weightClass%." - MATERIAL: REDSTONE - ONLY-RANKED: - NAME: "&cThis ladder is only %weightClass%." - MATERIAL: REDSTONE - SWITCH-TO-UNRANKED: - NAME: "&aSwitch to %weightClass%" - MATERIAL: WOOD_SWORD - SWITCH-TO-RANKED: - NAME: "&aSwitch to %weightClass%" - MATERIAL: IRON_SWORD - MATCH-TYPE: - TITLE: "&1%ladder% &8- Match Types" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - ENABLED: - NAME: "%matchType%" - MATERIAL: INK_SACK - DAMAGE: 10 - LORE: - - "" - - "&eClick here &7to &cdisable %matchType%" - - "&7match type for the ladder." - DISABLED: - NAME: "%matchType%" - MATERIAL: INK_SACK - DAMAGE: 8 - LORE: - - "" - - "&eClick here &7to &aenable %matchType%" - - "&7match type for the ladder." - SKYWARS-LOOT: - TITLE: "&1%ladder% &8- SkyWars loot" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - EVENT: - EVENT-MANAGER: - TITLE: "&8Event Manager" - ICONS: - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - EVENT-ICON: - STATUS-NAMES: - ENABLED: "&aEnabled" - DISABLED: "&cDisabled" - NAME: "&e%eventName%" - LORE: - - "" - - "&6Event Information:" - - " &7» &eState: %state%" - - "" - - "&b&lClick here &bto open event settings." - EVENT-MAIN: - TITLE: "%eventName% &8- Event" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - EVENT-NAME: - NAME: "&e%eventName%" - LORE: - - "" - - "&7&lIcon Customization:" - - "&b» LEFT-CLICK &7with an item to set as icon" - - "" - - "&7&lQuick Teleport:" - - "&b» RIGHT-CLICK &7to teleport to event arena" - - "" - - "&7Change the visual icon shown in the" - - "&7Event Host GUI by clicking with any item." - SETTINGS: - NAME: "&4Settings" - MATERIAL: REDSTONE - LORE: - - "" - - "&e&lCLICK &7to configure event settings:" - - "" - - " &8» &cBroadcast Interval &7(chat announcements)" - - " &8» &cQueue Wait Time &7(before start)" - - " &8» &cMax Queue Time &7(before cancel)" - - " &8» &cGame Duration &7(match length)" - - " &8» &cStart Countdown &7(game start delay)" - - " &8» &cMin/Max Players &7(requirements)" - - "" - - "&7Fine-tune event behavior and timings." - STATUS: - ENABLED: - NAME: "&7Status: &aEnabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&e&lClick here &7to &cdisable &7the event." - - "" - - "&eYou can only edit the event if its disabled." - DISABLED: - NAME: "&7Status: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&e&lCLICK &7to &aenable &7the event." - - "" - - "&c&lRequirements to Enable:" - - " &8» &eEvent region (2 corners) must be set" - - " &8» &eAt least 2 spawn points must be set" - - " &8» &eAll settings must be configured" - - "" - - "&7&oUse the LOCATION button to set these up!" - LOCATION: - NAME: "&5Locations" - MATERIAL: COMPASS - LORE: - - "" - - "&d&lLEFT-CLICK &7to start interactive setup mode." - - "" - - "&5&lSetup Process:" - - "&71. &dReceive Event Wand &7to configure locations" - - "&72. &dSet Corners: &7Left/Right click to mark region" - - "&73. &dAdd Spawns: &7Right click blocks to add spawn points" - - "&74. &dCycle Modes: &7Shift + Left/Right click" - - "&75. &dExit Setup: &7Drop (Q) the wand" - - "" - - "&5&lCurrently Configured:" - - " &5» &dCorner 1: &7%corner1%" - - " &5» &dCorner 2: &7%corner2%" - - " &5» &dSpawn Points: &7%spawnPositions% set" - - "" - - "&7&oNo commands needed - use the wand!" - EVENT-SETTINGS: - TITLE: "&1%eventName% &8- Settings" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - BROADCAST-INTERVAL: - NAME: "&7Broadcast Interval: &6%broadcastInterval% &7sec" - MATERIAL: WATCH - LORE: - - "" - - "&7The event will be announced" - - "&7every so often on the chat." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - WAIT-BEFORE-START: - NAME: "&7Wait before event start: &6%waitBeforeStart% &7sec" - MATERIAL: ANVIL - LORE: - - "" - - "&7The event waits up to this number" - - "&7of seconds before starts the game" - - "&7if it reaches the minimum number of players." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - MAX-QUEUE-TIME: - NAME: "&7Maximum Queue Time: &6%queueTime% &7min" - MATERIAL: BOOK - LORE: - - "" - - "&7The event waits up to this number" - - "&7of minutes before it stops the" - - "&7queue if the game does not start." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - DURATION: - TNTTAG: - NAME: "&7Tnt Explode Time: &6%explodeTime% &7sec" - MATERIAL: TNT - LORE: - - "" - - "&7After all this time, the tnt explodes." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - SUMO&BRACKETS: - NAME: "&7Duel Duration: &6%roundDuration% &7min" - MATERIAL: BLAZE_ROD - LORE: - - "" - - "&7This is how long 1 game session lasts." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - OTHER: - NAME: "&7Game Duration: &6%duration% &7min" - MATERIAL: BLAZE_ROD - LORE: - - "" - - "&7That's how long the game lasts." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - START-TIME: - NAME: "&7Start Countdown: &6%startTime% &7sec" - MATERIAL: FEATHER - LORE: - - "" - - "&7The game starts after this time." - - "" - - "&a&lLEFT-CLICK &ato reduce the time." - - "&b&lRIGHT-CLICK &bto increase the time." - MIN-PLAYER: - NAME: "&7Min Player: &6%minPlayer%" - MATERIAL: SNOW_BALL - LORE: - - "" - - "&7At least this many players must" - - "&7join the event for it to start." - - "" - - "&a&lLEFT-CLICK &ato reduce the amount." - - "&b&lRIGHT-CLICK &bto increase the amount." - MAX-PLAYER: - NAME: "&7Max Player: &6%maxPlayer%" - MATERIAL: GHAST_TEAR - LORE: - - "" - - "&7Maximum number of players" - - "&7allowed to join the event." - - "" - - "&a&lLEFT-CLICK &ato reduce the amount." - - "&b&lRIGHT-CLICK &bto increase the amount." - HOLOGRAM: - HOLOGRAM-MANAGER: - TITLE: "&8Hologram Manager" - ICONS: - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - HOLOGRAM-ICON: - STATUS-NAMES: - ENABLED: "&aEnabled" - DISABLED: "&cDisabled" - TYPE-NULL: "&cN/A" - NAME: "&6%hologramName%" - MATERIAL: PAPER - LORE: - - "" - - "&6Hologram Information:" - - " &7» &eState: %state%" - - " &7» &eType: &f%type%" - - " &7» &eStats Show: &f%statsShow%" - - "" - - "&b&lLEFT-CLICK &bto open hologram settings." - - "&a&lRIGHT-CLICK &ato teleport to the hologram." - HOLOGRAM-MAIN: - TITLE: "&1%hologram% &8- Hologram" - ICONS: - BACK-TO: - NAME: "&cGo Back" - MATERIAL: ARROW - DELETE: - NAME: "&cDelete Hologram" - MATERIAL: INK_SACK - DAMAGE: 1 - EVENT-TYPE: - NAME: "&6Hologram Type" - MATERIAL: NETHER_STAR - LORE: - - "" - - "%eventTypes%" - - "" - - "&b&lClick here &bto change the hologram's type." - LADDER: - NO-LADDER-SETTINGS: - NAME: "&cThis hologram type has no ladder settings!" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - HAS-LADDER-SETTINGS: - NAME: "&3Ladder Settings" - MATERIAL: GOLD_SWORD - LORE: - - "" - - "&b&lClick here &bto open the hologram's" - - "&bladder settings." - SHOW-STATS: - NAME: "&cShow Statistics: &f%showStats%" - MATERIAL: SKULL_ITEM - DAMAGE: 3 - LORE: - - "" - - "&7The hologram will show the" - - "&7first this many statistics." - - "" - - "&a&lLEFT-CLICK &ato decrease the number." - - "&b&lRIGHT-CLICK &bto increase the number." - STATUS: - ENABLED: - NAME: "&7Status: &aEnabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&e&lClick here &7to &cdisable &7the hologram." - DISABLED: - NAME: "&7Status: &cDisabled" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&e&lClick here &7to &aenable &7the hologram." - - "" - - "&c&lNote: &7The hologram has to meet some" - - "&7requirements to be enabled:" - - " &8» &eSet a type." - - " &8» &eSet the ladder(s) if necessary." - HOLOGRAM-LADDERS: - TITLE: "&1%hologram% &8- Ladders" - ICONS: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - ENABLED-LADDER: - NAME: "&a%ladder%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 5 - LORE: - - "" - - "&7This ladder is &aenabled&7." - - "" - - "&eClick here &7to &cdisable&7." - DISABLED-LADDER: - NAME: "&c%ladder%" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 14 - LORE: - - "" - - "&7This ladder is &cdisabled&7." - - "" - - "&eClick here &7to &aenable&7." - SERVER: - SERVER-MANAGER: - TITLE: "&8Server Manager" - ICONS: - BACK-TO: - NAME: "&eBack to hub" - MATERIAL: ARROW - INFORMATIONS: - STATUS-NAMES: - SET: "&aSet" - UNSET: "&cNot-Set" - NAME: "&eInformations" - MATERIAL: BOOK - LORE: - - "&8&m------------------------" - - "&7Online players: &e%onlinePlayers%" - - "&7Online staff: &e%onlineStaffs%" - - "" - - "&7Required unranked for ranked matches: &e%requiredDivision%" - - "" - - "&7Lobby status: %lobbyStatus%" - - "" - - "&7Enabled arenas: &e%enabledArena%" - - "&7Enabled ladders: &e%enabledLadder%" - - "&7Enabled events: &e%enabledEvents%" - - "&8&m------------------------" - LOBBY-ARMORS: - NAME: "&eLobby Armors" - MATERIAL: DIAMOND_CHESTPLATE - LORE: - - "&8&m------------------------" - - "&7Click here to edit the lobby armors." - - "&8&m------------------------" - SAVE: - NAME: "&eSave Data" - MATERIAL: SUGAR - LORE: - - "&8&m------------------------" - - "&aLeft Click &7to open a GUI" - - "&7where you can save your" - - "&7server data in sections." - - "" - - "&bRight Click &7to save all" - - "&7the server data manually." - - "&8&m------------------------" - MATCHES: - NAME: "&eLive Matches" - MATERIAL: IRON_SWORD - LORE: - - "&8&m------------------------" - - "&7Click here to view the" - - "&7live matches." - - "" - - "&7Live matches: &e%liveMatches%" - - "&8&m------------------------" - EVENTS: - NAME: "&eLive Events" - MATERIAL: BOW - LORE: - - "&8&m------------------------" - - "&7Click here to view the" - - "&7live events." - - "" - - "&7Live events: &e%liveEvents%" - - "&8&m------------------------" - LOBBY-ARMORS: - TITLE: "&8Lobby Armors" - ICONS: - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - FILLER-ITEM: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 15 - FILLER-ITEM2: - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - NAME-ITEM: - NAME: "&e%inventoryName%" - MATERIAL: NAME_TAG - EVENTS: - TITLE: "&8Events" - ICONS: - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - REFRESH-PAGE: - NAME: "&aRefresh Page" - MATERIAL: NETHER_STAR - LORE: - - "&8&m------------------------" - - "&7Click here to refresh the page." - - "&8&m------------------------" - EVENT-ITEM: - NAME: "%eventName%" - LORE: - - "&8&m------------------------" - - "&eEvent Type: &f%type%" - - "" - - "&ePlayers: &f%players%" - - "&eSpectators: &f%spectators%" - - "" - - "&aLeft Click &7to spectate the event." - - "&bRight Click &7to &cend &7the event." - - "&8&m------------------------" - MATCHES: - TITLE: "&8Matches - Page %page%" - ICONS: - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - GO-PAGE-LEFT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - GO-PAGE-RIGHT: - NAME: "&6Go to Page %page%" - MATERIAL: ARROW - REFRESH: - NAME: "&aRefresh Pages" - MATERIAL: NETHER_STAR - LORE: - - "&8&m------------------------" - - "&7Click here to refresh the pages." - - "&8&m------------------------" - MATCH-ICON: - NAME: "%matchType%" - LORE: - - "&8&m------------------------" - - "&8#%matchId%" - - "%weightClass%" - - "" - - "&eMatch Type: &f%matchType%" - - "&eKit: &f%ladder%" - - "&eArena: &f%arena%" - - "&eDuration: &f%roundDuration%" - - "&eSpectators: &f%spectators%" - - "" - - "&aLeft Click &7to spectate the match." - - "&bRight Click &7to &cend &7the match." - - "&8&m------------------------" - FILE-SAVE: - TITLE: "&8Data Saver" - ICONS: - BACK-TO: - NAME: "&cBack to Server Manager" - MATERIAL: ARROW - DATA-SAVE: - NAME: "&e%data% Data Save" - MATERIAL: PAPER - LORE: - - "&8&m------------------------" - - "&7Click here to manually" - - "&7save the %data% data." - - "&8&m------------------------" \ No newline at end of file diff --git a/core/src/main/resources/1.8.8/inventories.yml b/core/src/main/resources/1.8.8/inventories.yml deleted file mode 100644 index d0f23ce0a..000000000 --- a/core/src/main/resources/1.8.8/inventories.yml +++ /dev/null @@ -1,249 +0,0 @@ -VERSION: 1 - -# -# Spawn inventories -# Set the slot to -1 if you don't want to display the item. -# -LOBBY-BASIC: - NORMAL: - UNRANKED: - SLOT: 0 - ITEM: - NAME: "&eUnranked Queue &7(Right-Click)" - MATERIAL: WOOD_SWORD - RANKED: - SLOT: 1 - ITEM: - NAME: "&cRanked Queue &7(Right-Click)" - MATERIAL: IRON_SWORD - ENABLE-SPECTATE-MODE: - SLOT: 3 - ITEM: - NAME: "&aEnable &eSpectate Mode &7(Right-Click)" - MATERIAL: REDSTONE_TORCH_ON - PARTY-CREATE: - SLOT: 4 - ITEM: - NAME: "&dCreate Party &7(Right-Click)" - MATERIAL: NAME_TAG - SETTINGS: - SLOT: 7 - ITEM: - NAME: "&aSettings &7(Right-Click)" - MATERIAL: WATCH - KIT-EDITOR: - SLOT: 8 - ITEM: - NAME: "&6Kit Editor &7(Right-Click)" - MATERIAL: BOOK - SETUP: - SLOT: 5 - ITEM: - NAME: "&cManage Server &7(Right-Click)" - MATERIAL: REDSTONE - STAFF-MODE: - SLOT: 5 - ITEM: - NAME: "&aEnable &dStaff Mode &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 5 - REMATCH: - SLOT: 3 - ITEM: - NAME: "&6Rematch &7(Right-Click)" - MATERIAL: BLAZE_POWDER - STATISTICS: - SLOT: 6 - ITEM: - NAME: "&2Statistics &7(Right-Click)" - MATERIAL: EMERALD - EXTRA: - # HERE YOU CAN PUT THE EXTRA ITEMS LIKE THIS: - #STUFF-ITEM: - # COMMAND: unranked # Don't write the / character before the command. - # SLOT: 2 - # ITEM: - # NAME: "&cStuff Item" - # MATERIAL: DIRT - # DAMAGE: 0 - # LORE: - # - "" - # - "&dLore" -# -# Party inventory items -# -PARTY: - NORMAL: - HOST-PARTY-GAME: - SLOT: 0 - ITEM: - NAME: "&eHost Party Event &7(Right-Click)" - MATERIAL: GOLD_AXE - PARTY-INFO: - SLOT: 1 - ITEM: - NAME: "&bParty Information &7(Right-Click)" - MATERIAL: NETHER_STAR - OTHER-PARTIES: - SLOT: 2 - ITEM: - NAME: "&aOther Parties &7(Right-Click)" - MATERIAL: SKULL_ITEM - LEAVE-PARTY: - SLOT: 8 - ITEM: - NAME: "&cLeave Party &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - PARTY-SETTINGS: - SLOT: 4 - ITEM: - NAME: "&6Party Settings &7(Right-Click)" - MATERIAL: WATCH - PARTY-KIT-EDITOR: - SLOT: 7 - ITEM: - NAME: "&6Kit Editor &7(Right-Click)" - MATERIAL: BOOK - EXTRA: - # EXTRA ITEMS LIKE UPPER -# -# Queue items -# -QUEUE: - MATCH: - NORMAL: - LEAVE-MATCH-QUEUE: - SLOT: 4 - ITEM: - NAME: "&cLeave Queue &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - EXTRA: - # EXTRA ITEMS LIKE UPPER - EVENT: - NORMAL: - LEAVE-EVENT-QUEUE: - SLOT: 4 - ITEM: - NAME: "&cLeave &e%event% &cEvent Queue &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - EXTRA: - # EXTRA ITEMS LIKE UPPER -# -# Spectator items -# -SPECTATOR: - LOBBY: - NORMAL: - MENU: - SLOT: 5 - ITEM: - NAME: "&bSpectate Menu &7(Right-Click)" - MATERIAL: PAPER - DISABLE: - SLOT: 4 - ITEM: - NAME: "&cDisable &eSpectate Mode &7(Right-Click)" - MATERIAL: REDSTONE_TORCH_ON - RANDOM: - SLOT: 3 - ITEM: - NAME: "&aSpectate Random Match &7(Right-Click)" - MATERIAL: COMPASS - EXTRA: - # EXTRA ITEMS LIKE UPPER - MATCH: - NORMAL: - MENU: - SLOT: 5 - ITEM: - NAME: "&bSpectate Menu &7(Right-Click)" - MATERIAL: PAPER - RANDOM: - SLOT: 4 - ITEM: - NAME: "&dSpectate Random Match &7(Right-Click)" - MATERIAL: COMPASS - SHOW-SPECTATORS: - SLOT: 0 - ITEM: - NAME: "&eShow Spectators &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 8 - HIDE-SPECTATORS: - SLOT: 0 - ITEM: - NAME: "&eHide Spectators &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 10 - LEAVE: - SLOT: 8 - ITEM: - NAME: "&cStop Spectating &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - EXTRA: - # EXTRA ITEMS LIKE UPPER - EVENT: - NORMAL: - LEAVE: - SLOT: 8 - ITEM: - NAME: "&cStop Spectating &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - EXTRA: - # EXTRA ITEMS LIKE UPPER - FFA: - NORMAL: - LEAVE: - SLOT: 8 - ITEM: - NAME: "&cStop Spectating &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - EXTRA: - # EXTRA ITEMS LIKE UPPER -# -# Staff Mode items -# -STAFF-MODE: - NORMAL: - RANDOM-GAME-SPECTATE: - SLOT: 0 - ITEM: - NAME: "&dSpectate Random Match &7(Right-Click)" - MATERIAL: COMPASS - PLAYER-INVENTORY: - SLOT: 1 - ITEM: - NAME: "&6View Player's Inventory &7(Right-Click)" - MATERIAL: STICK - HIDE-FROM-PLAYERS-ON: - SLOT: 8 - ITEM: - NAME: "&eShow Myself To Players &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 8 - HIDE-FROM-PLAYERS-OFF: - SLOT: 8 - ITEM: - NAME: "&eHide Myself From Players &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 10 - TURN-OFF: - SLOT: 4 - ITEM: - NAME: "&cTurn Off StaffMode &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - LEAVE-SPECTATE: - SLOT: 7 - ITEM: - NAME: "&cLeave Spectation &7(Right-Click)" - MATERIAL: INK_SACK - DAMAGE: 1 - EXTRA: - # EXTRA ITEMS LIKE UPPER \ No newline at end of file diff --git a/core/src/main/resources/1.8.8/ladders/archer.yml b/core/src/main/resources/1.8.8/ladders/archer.yml deleted file mode 100644 index a8a21174c..000000000 --- a/core/src/main/resources/1.8.8/ladders/archer.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Archer -enabled: true -type: BASIC -settings: - regen: false - hunger: false - ranked: false - editable: true - hitdelay: 20 - rounds: 2 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: true - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: BOW - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §6Archer -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAANTEVBVEhFUl9CT09UU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAA - AnEAfgALdAAQTEVBVEhFUl9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJ - dXEAfgAGAAAAAnEAfgALdAASTEVBVEhFUl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAA - AnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAt0AA5MRUFUSEVSX0hFTE1FVA== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QAA0JPV3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHQACW1ldGEtdHlwZXQACGVu - Y2hhbnRzdXEAfgAGAAAAA3QACEl0ZW1NZXRhdAAKVU5TUEVDSUZJQ3NxAH4AA3VxAH4ABgAAAAN0 - AAxBUlJPV19EQU1BR0V0AApEVVJBQklMSVRZdAAOQVJST1dfSU5GSU5JVEV1cQB+AAYAAAADc3IA - EWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVy - hqyVHQuU4IsCAAB4cAAAAAFzcQB+ABwAAAADcQB+AB5zcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+ - AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHQAC0VOREVSX1BFQVJMcHBwcHBwc3EAfgAAc3EAfgADdXEA - fgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAx0AAVBUlJPV3BwcHBwcHBwcHBwcHBwcHBw - cHBwcHBwcHBwcA== diff --git a/core/src/main/resources/1.8.8/ladders/axe.yml b/core/src/main/resources/1.8.8/ladders/axe.yml deleted file mode 100644 index 93e6f5a80..000000000 --- a/core/src/main/resources/1.8.8/ladders/axe.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Axe -enabled: true -type: BASIC -settings: - regen: true - hunger: true - ranked: false - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: IRON_AXE - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §7Axe -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9CT09UU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAANSVJPTl9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAG - AAAAAnEAfgALdAAPSVJPTl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+ - AAl1cQB+AAYAAAACcQB+AAt0AAtJUk9OX0hFTE1FVA== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QACElST05fQVhFc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIdAAJbWV0YS10eXBl - dAAIZW5jaGFudHN1cQB+AAYAAAADdAAISXRlbU1ldGF0AApVTlNQRUNJRklDc3IAN2NvbS5nb29n - bGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlQmlNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIA - AHhxAH4AA3VxAH4ABgAAAAF0AApEQU1BR0VfQUxMdXEAfgAGAAAAAXNyABFqYXZhLmxhbmcuSW50 - ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAA - AAABc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZkYW1hZ2V1cQB+AAYAAAADcQB+ - AAx0AAZQT1RJT05zcgAPamF2YS5sYW5nLlNob3J0aE03EzRg2lICAAFTAAV2YWx1ZXhxAH4AHCAi - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4ADHEAfgAj - c3EAfgAkQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAhdXEAfgAGAAAAA3EA - fgAMcQB+ACNzcQB+ACRAJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACF1cQB+ - AAYAAAADcQB+AAxxAH4AI3NxAH4AJEAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlx - AH4AIXVxAH4ABgAAAANxAH4ADHEAfgAjc3EAfgAkQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+ - AAhxAH4ACXEAfgAhdXEAfgAGAAAAA3EAfgAMcQB+ACNzcQB+ACRAJXNxAH4AAHNxAH4AA3VxAH4A - BgAAAANxAH4ACHEAfgAJcQB+ACF1cQB+AAYAAAADcQB+AAxxAH4AI3NxAH4AJEAlc3EAfgAAc3EA - fgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZhbW91bnR1cQB+AAYAAAADcQB+AAx0AAxHT0xERU5f - QVBQTEVzcQB+ABsAAAAMcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHNxAH4AAHNxAH4AA3VxAH4A - BgAAAANxAH4ACHEAfgAJcQB+ACF1cQB+AAYAAAADcQB+AAxxAH4AI3NxAH4AJEAlc3EAfgAAc3EA - fgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4ADHEAfgAjc3EAfgAkICI= -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AAZhbW91bnR1cQB+AAYAAAADdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnku - SXRlbVN0YWNrdAAMQkFLRURfUE9UQVRPc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJ - AAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAEBzcQB+AABzcQB+AAN1 - cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAANR09MREVOX0NBUlJPVHEA - fgAQc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHQA - C0NPT0tFRF9CRUVGcQB+ABBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw diff --git a/core/src/main/resources/1.8.8/ladders/battlerush.yml b/core/src/main/resources/1.8.8/ladders/battlerush.yml deleted file mode 100644 index a8ff5201f..000000000 --- a/core/src/main/resources/1.8.8/ladders/battlerush.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: BattleRush -enabled: true -type: BATTLE_RUSH -settings: - regen: true - hunger: false - ranked: true - editable: true - drop-inventory: false - multiRoundStartCountdown: true - hitdelay: 20 - rounds: 3 - epcooldown: 13 - gacooldown: 0 - startcountdown: 3 - knockback: DEFAULT - matchtypes: - - DUEL - - PARTY_SPLIT - - PARTY_VS_PARTY -respawn-time: 3 -tempbuild-delay: 10 -icon: - ==: org.bukkit.inventory.ItemStack - type: WATER_LILY - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §2Battle§7Rush -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAGU0hFQVJTc3EAfgAAc3EAfgADdXEAfgAGAAAABHEAfgAIcQB+AAl0AAZkYW1hZ2V0AAZhbW91 - bnR1cQB+AAYAAAAEcQB+AAt0AARXT09Mc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpSAgABUwAF - dmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAADnNyABFqYXZhLmxhbmcuSW50 - ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cQB+ABUAAABAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw - cHBwcHBwcHBwcA== -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADUxFQVRIRVJfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAVjb2xvcnVxAH4ABgAAAAN0AAhJdGVtTWV0YXQADUxFQVRIRVJfQVJNT1JzcQB+AABz - cQB+AAN1cQB+AAYAAAAEcQB+AAh0AANSRUR0AARCTFVFdAAFR1JFRU51cQB+AAYAAAAEdAAFQ29s - b3JzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5O - dW1iZXKGrJUdC5TgiwIAAHhwAAAA/3NxAH4AHgAAAABxAH4AIXNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABBMRUFUSEVSX0xFR0dJTkdTc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAA - c3EAfgADdXEAfgAGAAAABHEAfgAIcQB+ABlxAH4AGnEAfgAbdXEAfgAGAAAABHEAfgAdc3EAfgAe - AAAA/3EAfgAhcQB+ACFzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAG - AAAAA3EAfgAMdAASTEVBVEhFUl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAI - cQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAAc3EAfgADdXEAfgAGAAAABHEAfgAI - cQB+ABlxAH4AGnEAfgAbdXEAfgAGAAAABHEAfgAdc3EAfgAeAAAA/3EAfgAhcQB+ACFw \ No newline at end of file diff --git a/core/src/main/resources/1.8.8/ladders/bedwars.yml b/core/src/main/resources/1.8.8/ladders/bedwars.yml deleted file mode 100644 index f131d5dd2..000000000 --- a/core/src/main/resources/1.8.8/ladders/bedwars.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Bedwars -enabled: true -type: BEDWARS -settings: - regen: true - hunger: false - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 3 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -bedwars-respawn: 4 -icon: - ==: org.bukkit.inventory.ItemStack - type: BED - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §eBedwars -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9CT09UU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAANSVJPTl9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAG - AAAAAnEAfgALdAASTEVBVEhFUl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAI - cQB+AAl1cQB+AAYAAAACcQB+AAt0AA5MRUFUSEVSX0hFTE1FVA== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKV09PRF9TV09SRHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJdAAGYW1vdW50dXEA - fgAGAAAAA3EAfgALdAAEV09PTHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFs - dWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAABAc3EAfgAAc3EAfgADdXEAfgAG - AAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAt0AAZTSEVBUlNzcQB+AABzcQB+AAN1cQB+AAYA - AAADcQB+AAhxAH4ACXQABG1ldGF1cQB+AAYAAAADcQB+AAt0AAhXT09EX0FYRXNxAH4AAHNxAH4A - A3VxAH4ABgAAAANxAH4ACHQACW1ldGEtdHlwZXQACGVuY2hhbnRzdXEAfgAGAAAAA3QACEl0ZW1N - ZXRhdAAKVU5TUEVDSUZJQ3NyADdjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUJp - TWFwJFNlcmlhbGl6ZWRGb3JtAAAAAAAAAAACAAB4cQB+AAN1cQB+AAYAAAABdAAJRElHX1NQRUVE - dXEAfgAGAAAAAXNxAH4AEwAAAAFzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAe - dXEAfgAGAAAAA3EAfgALdAAMV09PRF9QSUNLQVhFc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAI - cQB+ACRxAH4AJXVxAH4ABgAAAANxAH4AJ3EAfgAoc3EAfgApdXEAfgAGAAAAAXEAfgAsdXEAfgAG - AAAAAXEAfgAucHBzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4A - C3QADEdPTERFTl9BUFBMRXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ABB1cQB+ - AAYAAAADcQB+AAt0AAZMQURERVJzcQB+ABMAAAAQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw diff --git a/core/src/main/resources/1.8.8/ladders/boxing.yml b/core/src/main/resources/1.8.8/ladders/boxing.yml deleted file mode 100644 index 6a9195e88..000000000 --- a/core/src/main/resources/1.8.8/ladders/boxing.yml +++ /dev/null @@ -1,109 +0,0 @@ -name: Boxing -enabled: true -type: BOXING -settings: - regen: true - hunger: false - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: -- ==: PotionEffect - effect: 1 - duration: 12000 - amplifier: 1 - ambient: false - has-particles: true -boxing-winhit: 100 -icon: - ==: org.bukkit.inventory.ItemStack - type: JUKEBOX - meta: - ==: ItemMeta - meta-type: TILE_ENTITY - display-name: §aBoxing - blockMaterial: JUKEBOX -armor: | - rO0ABXcEAAAABHBwcHA= -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcgA3Y29t - Lmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVCaU1hcCRTZXJpYWxpemVkRm9ybQAAAAAA - AAAAAgAAeHEAfgADdXEAfgAGAAAAAXQACkRBTUFHRV9BTEx1cQB+AAYAAAABc3IAEWphdmEubGFu - Zy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsC - AAB4cAAAAAFwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcA== -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QACklST05fU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRhLXR5 - cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1cQB+ - AAYAAAACdAAKREFNQUdFX0FMTHQACkRVUkFCSUxJVFl1cQB+AAYAAAACc3IAEWphdmEubGFuZy5J - bnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4 - cAAAAAFzcQB+ABsAAAADc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4A - BgAAAANxAH4ADHQACkdPTERfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEA - fgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAA - AAJxAH4AHXEAfgAec3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAA - AANxAH4ADHQAC1NUT05FX1NXT1JEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4A - EnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAAC - cQB+AB1xAH4AHnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAAD - cQB+AAx0AApXT09EX1NXT1JEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVx - AH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAACcQB+ - AB1xAH4AHnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+ - AAx0AAhSQVdfRklTSHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ABJ1cQB+AAYA - AAADcQB+ABRxAH4AFXNyADdjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUJpTWFw - JFNlcmlhbGl6ZWRGb3JtAAAAAAAAAAACAAB4cQB+AAN1cQB+AAYAAAABcQB+ABh1cQB+AAYAAAAB - cQB+AB1wc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAx0AA1E - SUFNT05EX1NXT1JEc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+ - AAxxAH4AI3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ - AC9zcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgA7c3EA - fgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AR3BwcHBwcHBw - cHBwcHBwcHBw - ranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QACklST05fU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRhLXR5 - cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1cQB+ - AAYAAAACdAAKREFNQUdFX0FMTHQACkRVUkFCSUxJVFl1cQB+AAYAAAACc3IAEWphdmEubGFuZy5J - bnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4 - cAAAAAFzcQB+ABsAAAADc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4A - BgAAAANxAH4ADHQACkdPTERfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEA - fgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAA - AAJxAH4AHXEAfgAec3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAA - AANxAH4ADHQAC1NUT05FX1NXT1JEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4A - EnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAAC - cQB+AB1xAH4AHnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAAD - cQB+AAx0AApXT09EX1NXT1JEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVx - AH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAACcQB+ - AB1xAH4AHnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+ - AAx0AAhSQVdfRklTSHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ABJ1cQB+AAYA - AAADcQB+ABRxAH4AFXNyADdjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUJpTWFw - JFNlcmlhbGl6ZWRGb3JtAAAAAAAAAAACAAB4cQB+AAN1cQB+AAYAAAABcQB+ABh1cQB+AAYAAAAB - cQB+AB1wc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAx0AA1E - SUFNT05EX1NXT1JEc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+ - AAxxAH4AI3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ - AC9zcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgA7c3EA - fgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AR3BwcHBwcHBw - cHBwcHBwcHBw diff --git a/core/src/main/resources/1.8.8/ladders/bridges.yml b/core/src/main/resources/1.8.8/ladders/bridges.yml deleted file mode 100644 index 968bfc133..000000000 --- a/core/src/main/resources/1.8.8/ladders/bridges.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Bridges -enabled: true -type: BRIDGES -settings: - regen: true - hunger: false - ranked: true - editable: true - drop-inventory: false - multiRoundStartCountdown: false - hitdelay: 20 - rounds: 5 - epcooldown: 13 - gacooldown: 0 - startcountdown: 3 - respawntime: 3 - knockback: DEFAULT - matchtypes: - - DUEL - - PARTY_SPLIT - - PARTY_VS_PARTY - weightClass: UNRANKED_AND_RANKED -icon: - ==: org.bukkit.inventory.ItemStack - type: STAINED_CLAY - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §eBridges -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9TV09SRHNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAADQk9Xc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AARtZXRhdXEAfgAGAAAA - A3EAfgALdAAPRElBTU9ORF9QSUNLQVhFc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIdAAJbWV0 - YS10eXBldAAIZW5jaGFudHN1cQB+AAYAAAADdAAISXRlbU1ldGF0AApVTlNQRUNJRklDc3IAN2Nv - bS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlQmlNYXAkU2VyaWFsaXplZEZvcm0AAAAA - AAAAAAIAAHhxAH4AA3VxAH4ABgAAAAF0AAlESUdfU1BFRUR1cQB+AAYAAAABc3IAEWphdmEubGFu - Zy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsC - AAB4cAAAAAJzcQB+AABzcQB+AAN1cQB+AAYAAAAEcQB+AAhxAH4ACXQABmRhbWFnZXQABmFtb3Vu - dHVxAH4ABgAAAARxAH4AC3QADFNUQUlORURfQ0xBWXNyAA9qYXZhLmxhbmcuU2hvcnRoTTcTNGDa - UgIAAVMABXZhbHVleHEAfgAmAA5zcQB+ACUAAABAc3EAfgAAc3EAfgADdXEAfgAGAAAABHEAfgAI - cQB+AAlxAH4AK3EAfgAsdXEAfgAGAAAABHEAfgALcQB+AC5xAH4AMHEAfgAxc3EAfgAAc3EAfgAD - dXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ALHVxAH4ABgAAAANxAH4AC3QADEdPTERFTl9BUFBMRXNx - AH4AJQAAAAhwcHNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAL - dAAFQVJST1dwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA= -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADUxFQVRIRVJfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAVjb2xvcnVxAH4ABgAAAAN0AAhJdGVtTWV0YXQADUxFQVRIRVJfQVJNT1JzcQB+AABz - cQB+AAN1cQB+AAYAAAAEcQB+AAh0AANSRUR0AARCTFVFdAAFR1JFRU51cQB+AAYAAAAEdAAFQ29s - b3JzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5O - dW1iZXKGrJUdC5TgiwIAAHhwAAAA/3NxAH4AHgAAAABxAH4AIXNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABBMRUFUSEVSX0xFR0dJTkdTc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAA - c3EAfgADdXEAfgAGAAAABHEAfgAIcQB+ABlxAH4AGnEAfgAbdXEAfgAGAAAABHEAfgAdc3EAfgAe - AAAA/3EAfgAhcQB+ACFzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAG - AAAAA3EAfgAMdAASTEVBVEhFUl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAI - cQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAAc3EAfgADdXEAfgAGAAAABHEAfgAI - cQB+ABlxAH4AGnEAfgAbdXEAfgAGAAAABHEAfgAdc3EAfgAeAAAA/3EAfgAhcQB+ACFw -custom-kit-extra-items: {} -destroyable-blocks: - - STAINED_CLAY::11 - - STAINED_CLAY::14 \ No newline at end of file diff --git a/core/src/main/resources/1.8.8/ladders/builduhc.yml b/core/src/main/resources/1.8.8/ladders/builduhc.yml deleted file mode 100644 index 1e2473b6e..000000000 --- a/core/src/main/resources/1.8.8/ladders/builduhc.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: BuildUHC -enabled: true -type: BUILD -settings: - regen: false - hunger: true - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: LAVA_BUCKET - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §cBuildUHC -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAKRFVSQUJJTElUWXQAD1BST1RFQ1RJT05fRkFMTHQAFVBST1RFQ1RJT05fUFJP - SkVDVElMRXVxAH4ABgAAAANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVl - eHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAA3NxAH4AHAAAAARzcQB+ABwAAAAC - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHQAEERJ - QU1PTkRfTEVHR0lOR1NzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAG - AAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACdAAYUFJPVEVDVElPTl9FTlZJUk9OTUVOVEFM - cQB+ABh1cQB+AAYAAAACcQB+ACBxAH4AHnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJ - cQB+AAp1cQB+AAYAAAADcQB+AAx0ABJESUFNT05EX0NIRVNUUExBVEVzcQB+AABzcQB+AAN1cQB+ - AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAAC - cQB+ACxxAH4AGHVxAH4ABgAAAAJxAH4AIHEAfgAec3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAI - cQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHQADkRJQU1PTkRfSEVMTUVUc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAA - AnEAfgAacQB+ABh1cQB+AAYAAAACcQB+ACBxAH4AHg== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAACdAAKREFNQUdFX0FMTHQACkRVUkFCSUxJVFl1cQB+AAYAAAACc3IAEWphdmEubGFu - Zy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsC - AAB4cAAAAANxAH4AHXNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgAMdAALRklTSElOR19ST0RzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEA - fgAGAAAAA3EAfgAMdAADQk9Xc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVx - AH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnQADEFSUk9XX0RBTUFHRXEAfgAZdXEA - fgAGAAAAAnEAfgAdcQB+AB1zcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAA - AAJxAH4ADHQAC0xBVkFfQlVDS0VUc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+ - AAYAAAACcQB+AAx0AAxXQVRFUl9CVUNLRVRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - CXQABmFtb3VudHVxAH4ABgAAAANxAH4ADHQADEdPTERFTl9BUFBMRXNxAH4AGwAAAAZzcQB+AABz - cQB+AAN1cQB+AAYAAAAFcQB+AAhxAH4ACXQABmRhbWFnZXEAfgA9cQB+AAp1cQB+AAYAAAAFcQB+ - AAxxAH4AP3NyAA9qYXZhLmxhbmcuU2hvcnRoTTcTNGDaUgIAAVMABXZhbHVleHEAfgAcAAFzcQB+ - ABsAAAADc3EAfgAAc3EAfgADdXEAfgAGAAAABXEAfgAIcQB+ABF0AAxkaXNwbGF5LW5hbWV0AARs - b3JldAAJSXRlbUZsYWdzdXEAfgAGAAAABXEAfgAUcQB+ABV0ABHCp2XCp2xHb2xkZW4gSGVhZHNy - ADZjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3QkU2VyaWFsaXplZEZvcm0A - AAAAAAAAAAIAAVsACGVsZW1lbnRzcQB+AAR4cHVxAH4ABgAAAAR0AAB0AB3CpzdUaGlzIGFwcGxl - IGdpdmVzIHlvdSBleHRyYXQAFsKnN2hlYWx0aCBhbmQgZWZmZWN0cy5xAH4AVHNyABFqYXZhLnV0 - aWwuSGFzaFNldLpEhZWWuLc0AwAAeHB3DAAAABA/QAAAAAAABnQADkhJREVfUExBQ0VEX09OdAAN - SElERV9FTkNIQU5UU3QAEEhJREVfVU5CUkVBS0FCTEV0ABNISURFX1BPVElPTl9FRkZFQ1RTdAAP - SElERV9BVFRSSUJVVEVTdAANSElERV9ERVNUUk9ZU3hzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+ - AAhxAH4ACXEAfgA9dXEAfgAGAAAAA3EAfgAMdAALQ09PS0VEX0JFRUZzcQB+ABsAAABAc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4APXVxAH4ABgAAAANxAH4ADHQAC0NPQkJMRVNU - T05FcQB+AGRwcHBwcHBwcHBwcHBwcHBwcHBzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - CXEAfgA9dXEAfgAGAAAAA3EAfgAMdAAFQVJST1dzcQB+ABsAAAAgc3EAfgAAc3EAfgADdXEAfgAG - AAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAx0AAtESUFNT05EX0FYRXNxAH4AAHNxAH4AA3Vx - AH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMdAAPRElBTU9ORF9QSUNLQVhFc3EAfgAA - c3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4ANHNxAH4AAHNxAH4A - A3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ADlwcHBzcQB+AABzcQB+AAN1 - cQB+AAYAAAAEcQB+AAhxAH4ACXEAfgBEcQB+AD11cQB+AAYAAAAEcQB+AAx0AARXT09Ec3EAfgBG - AAJxAH4AZA== diff --git a/core/src/main/resources/1.8.8/ladders/combo.yml b/core/src/main/resources/1.8.8/ladders/combo.yml deleted file mode 100644 index 0385538ee..000000000 --- a/core/src/main/resources/1.8.8/ladders/combo.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Combo -enabled: true -type: BASIC -settings: - regen: true - hunger: true - ranked: true - editable: true - hitdelay: 2 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: COMBO - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: -- ==: PotionEffect - effect: 1 - duration: 9600 - amplifier: 1 - ambient: false - has-particles: true -icon: - ==: org.bukkit.inventory.ItemStack - type: RAW_FISH - damage: 3 - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §eCombo -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAYUFJPVEVDVElPTl9FTlZJUk9OTUVOVEFMdAAKRFVSQUJJTElUWXQAD1BST1RF - Q1RJT05fRkFMTHVxAH4ABgAAAANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZh - bHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAABHNxAH4AHAAAAAVxAH4AHnNx - AH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABBESUFN - T05EX0xFR0dJTkdTc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAA - AANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAACcQB+AB5xAH4A - H3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABJE - SUFNT05EX0NIRVNUUExBVEVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEA - fgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAAAAJxAH4A - HnEAfgAfc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4A - DHQADkRJQU1PTkRfSEVMTUVUc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVx - AH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAACcQB+ - AB5xAH4AHw== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAKREFNQUdFX0FMTHQACkRVUkFCSUxJVFl0AAtGSVJFX0FTUEVDVHVxAH4ABgAA - AANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5O - dW1iZXKGrJUdC5TgiwIAAHhwAAAAA3EAfgAec3EAfgAcAAAAAnNxAH4AAHNxAH4AA3VxAH4ABgAA - AARxAH4ACHEAfgAJdAAGZGFtYWdldAAGYW1vdW50dXEAfgAGAAAABHEAfgAMdAAMR09MREVOX0FQ - UExFc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpSAgABUwAFdmFsdWV4cQB+AB0AAXNxAH4AHAAA - AEBzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAAO - RElBTU9ORF9IRUxNRVRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAG - AAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACdAAYUFJPVEVDVElPTl9FTlZJUk9OTUVOVEFM - cQB+ABl1cQB+AAYAAAACc3EAfgAcAAAABHNxAH4AHAAAAAVzcQB+AABzcQB+AAN1cQB+AAYAAAAD - cQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAANRElBTU9ORF9CT09UU3NxAH4AAHNxAH4A - A3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ABJ1cQB+AAYAAAADcQB+ABRxAH4AFXNxAH4AA3VxAH4A - BgAAAANxAH4ANXEAfgAZdAAPUFJPVEVDVElPTl9GQUxMdXEAfgAGAAAAA3EAfgA3cQB+ADhxAH4A - N3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABBE - SUFNT05EX0xFR0dJTkdTc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4A - BgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgA1cQB+ABl1cQB+AAYAAAACcQB+ADdx - AH4AOHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0 - ABJESUFNT05EX0NIRVNUUExBVEVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgAS - dXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ADVxAH4AGXVxAH4ABgAAAAJx - AH4AN3EAfgA4cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw diff --git a/core/src/main/resources/1.8.8/ladders/debuff.yml b/core/src/main/resources/1.8.8/ladders/debuff.yml deleted file mode 100644 index 0c699c791..000000000 --- a/core/src/main/resources/1.8.8/ladders/debuff.yml +++ /dev/null @@ -1,129 +0,0 @@ -name: Debuff -enabled: true -type: BASIC -settings: - regen: true - hunger: true - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: true - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: POTION - damage: 8260 - meta: - ==: ItemMeta - meta-type: POTION - display-name: §aDebuff -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAYUFJPVEVDVElPTl9FTlZJUk9OTUVOVEFMdAAKRFVSQUJJTElUWXQAD1BST1RF - Q1RJT05fRkFMTHVxAH4ABgAAAANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZh - bHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAAnNxAH4AHAAAAANzcQB+ABwA - AAAEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHQA - EERJQU1PTkRfTEVHR0lOR1NzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEA - fgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAAAAJxAH4A - HnEAfgAfc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4A - DHQAEkRJQU1PTkRfQ0hFU1RQTEFURXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ - ABJ1cQB+AAYAAAADcQB+ABRxAH4AFXNxAH4AA3VxAH4ABgAAAAJxAH4AGHEAfgAZdXEAfgAGAAAA - AnEAfgAecQB+AB9zcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAA - A3EAfgAMdAAORElBTU9ORF9IRUxNRVRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEA - fgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAA - AAJxAH4AHnEAfgAf -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAKREFNQUdFX0FMTHQACkRVUkFCSUxJVFl0AAtGSVJFX0FTUEVDVHVxAH4ABgAA - AANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5O - dW1iZXKGrJUdC5TgiwIAAHhwAAAAA3EAfgAec3EAfgAcAAAAAnNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJdAAGYW1vdW50dXEAfgAGAAAAA3EAfgAMdAALRU5ERVJfUEVBUkxzcQB+ABwA - AAAQc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZkYW1hZ2V1cQB+AAYAAAADcQB+ - AAx0AAZQT1RJT05zcgAPamF2YS5sYW5nLlNob3J0aE03EzRg2lICAAFTAAV2YWx1ZXhxAH4AHSBD - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAs - c3EAfgAtICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EA - fgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+ - AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlx - AH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+ - AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4A - BgAAAANxAH4ACHEAfgAJcQB+ACN1cQB+AAYAAAADcQB+AAx0AAtDT09LRURfQkVFRnNxAH4AHAAA - AEBzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ - ACxzcQB+AC1AKnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAAD - cQB+AAxxAH4ALHNxAH4ALUAEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVx - AH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - CXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANx - AH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABz - cQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1A - JXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4A - LHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANx - AH4ADHEAfgAsc3EAfgAtICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEA - fgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AKnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJ - cQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EA - fgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+ - AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNx - AH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAl - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAs - c3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EA - fgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+ - AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlx - AH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+ - AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4A - BgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EA - fgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVz - cQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxz - cQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+ - AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4A - BgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEA - fgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4A - CHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAG - AAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtICI= -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AAZkYW1hZ2V1cQB+AAYAAAADdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnku - SXRlbVN0YWNrdAAGUE9USU9Oc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpSAgABUwAFdmFsdWV4 - cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHBABHNxAH4AAHNxAH4AA3VxAH4ABgAAAANx - AH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAxxAH4ADXNxAH4ADkAqc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHEAfgANc3EAfgAOICJzcQB+AABz - cQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMcQB+AA1zcQB+AA4g - Q3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAxxAH4A - DXNxAH4ADkAlcHBzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXQABmFtb3VudHVxAH4A - BgAAAANxAH4ADHQADEJBS0VEX1BPVEFUT3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgAB - SQAFdmFsdWV4cQB+AA8AAABAc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKHVx - AH4ABgAAAANxAH4ADHQADUdPTERFTl9DQVJST1RxAH4ALHBwcHBwcHBwcHBwcHBwcHBwcHA= - ranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AAZhbW91bnR1cQB+AAYAAAADdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnku - SXRlbVN0YWNrdAAMQkFLRURfUE9UQVRPc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJ - AAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAEBzcQB+AABzcQB+AAN1 - cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAANR09MREVOX0NBUlJPVHEA - fgAQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA= diff --git a/core/src/main/resources/1.8.8/ladders/fireball.yml b/core/src/main/resources/1.8.8/ladders/fireball.yml deleted file mode 100644 index 0955d5988..000000000 --- a/core/src/main/resources/1.8.8/ladders/fireball.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Fireball -enabled: true -type: FIREBALL_FIGHT -settings: - regen: true - hunger: false - ranked: true - editable: true - drop-inventory: false - multiRoundStartCountdown: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - gacooldown: 0 - startcountdown: 3 - knockback: DEFAULT - matchtypes: - - DUEL - - PARTY_SPLIT - - PARTY_VS_PARTY -custom-kit-extra-items: {} -effects: [] -bed-respawn: 3 -fireball-cooldown: 1.0 -icon: - ==: org.bukkit.inventory.ItemStack - type: FIREBALL - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §6Fireball §7Fight -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADUxFQVRIRVJfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAVjb2xvcnVxAH4ABgAAAAN0AAhJdGVtTWV0YXQADUxFQVRIRVJfQVJNT1JzcQB+AABz - cQB+AAN1cQB+AAYAAAAEcQB+AAh0AANSRUR0AARCTFVFdAAFR1JFRU51cQB+AAYAAAAEdAAFQ29s - b3JzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5O - dW1iZXKGrJUdC5TgiwIAAHhwAAAA/3NxAH4AHgAAAABxAH4AIXNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABBMRUFUSEVSX0xFR0dJTkdTc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAA - c3EAfgADdXEAfgAGAAAABHEAfgAIcQB+ABlxAH4AGnEAfgAbdXEAfgAGAAAABHEAfgAdc3EAfgAe - AAAA/3EAfgAhcQB+ACFzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAG - AAAAA3EAfgAMdAASTEVBVEhFUl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAI - cQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAAc3EAfgADdXEAfgAGAAAABHEAfgAI - cQB+ABlxAH4AGnEAfgAbdXEAfgAGAAAABHEAfgAdc3EAfgAeAAAA/3EAfgAhcQB+ACFzcQB+AABz - cQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAAOTEVBVEhFUl9I - RUxNRVRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAU - cQB+ABVzcQB+AABzcQB+AAN1cQB+AAYAAAAEcQB+AAhxAH4AGXEAfgAacQB+ABt1cQB+AAYAAAAE - cQB+AB1zcQB+AB4AAAD/cQB+ACFxAH4AIQ== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAALU1RPTkVfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAAEcQB+AAhxAH4ACXQABmRhbWFnZXQA - BmFtb3VudHVxAH4ABgAAAARxAH4AC3QABFdPT0xzcgAPamF2YS5sYW5nLlNob3J0aE03EzRg2lIC - AAFTAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAOc3IAEWphdmEubGFu - Zy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhxAH4AFQAAAEBzcQB+AABzcQB+AAN1cQB+AAYA - AAADcQB+AAhxAH4ACXEAfgARdXEAfgAGAAAAA3EAfgALdAALRU5ERVJfU1RPTkVzcQB+ABcAAAAI - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AEXVxAH4ABgAAAANxAH4AC3QACEZJ - UkVCQUxMc3EAfgAXAAAABnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ABF1cQB+ - AAYAAAADcQB+AAt0AANUTlRzcQB+ABcAAAACc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ - AAl0AARtZXRhdXEAfgAGAAAAA3EAfgALdAAMV09PRF9QSUNLQVhFc3EAfgAAc3EAfgADdXEAfgAG - AAAAA3EAfgAIdAAJbWV0YS10eXBldAAIZW5jaGFudHN1cQB+AAYAAAADdAAISXRlbU1ldGF0AApV - TlNQRUNJRklDc3IAN2NvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlQmlNYXAkU2Vy - aWFsaXplZEZvcm0AAAAAAAAAAAIAAHhxAH4AA3VxAH4ABgAAAAF0AAlESUdfU1BFRUR1cQB+AAYA - AAABc3EAfgAXAAAAAXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AC51cQB+AAYA - AAADcQB+AAt0AAhXT09EX0FYRXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgA0cQB+ADV1 - cQB+AAYAAAADcQB+ADdxAH4AOHNxAH4AOXVxAH4ABgAAAAFxAH4APHVxAH4ABgAAAAFxAH4APnNx - AH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgALdAAGU0hFQVJTc3EA - fgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AEXVxAH4ABgAAAANxAH4AC3QABkxBRERF - UnEAfgAecHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw diff --git a/core/src/main/resources/1.8.8/ladders/gapple.yml b/core/src/main/resources/1.8.8/ladders/gapple.yml deleted file mode 100644 index fee87bc00..000000000 --- a/core/src/main/resources/1.8.8/ladders/gapple.yml +++ /dev/null @@ -1,89 +0,0 @@ -name: Gapple -enabled: true -type: BASIC -settings: - regen: true - hunger: true - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: true - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: -- ==: PotionEffect - effect: 1 - duration: 9600 - amplifier: 1 - ambient: false - has-particles: true -- ==: PotionEffect - effect: 5 - duration: 9600 - amplifier: 1 - ambient: false - has-particles: true -icon: - ==: org.bukkit.inventory.ItemStack - type: GOLDEN_APPLE - damage: 1 - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §eGapple -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAACdAAYUFJPVEVDVElPTl9FTlZJUk9OTUVOVEFMdAAPUFJPVEVDVElPTl9GQUxMdXEA - fgAGAAAAAnNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5s - YW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAADc3EAfgAbAAAABHNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABBESUFNT05EX0xFR0dJTkdTc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3IAN2Nv - bS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlQmlNYXAkU2VyaWFsaXplZEZvcm0AAAAA - AAAAAAIAAHhxAH4AA3VxAH4ABgAAAAFxAH4AGHVxAH4ABgAAAAFxAH4AHXNxAH4AAHNxAH4AA3Vx - AH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABJESUFNT05EX0NIRVNUUExB - VEVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ - ABVzcQB+ACh1cQB+AAYAAAABcQB+ABh1cQB+AAYAAAABcQB+AB1zcQB+AABzcQB+AAN1cQB+AAYA - AAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAAORElBTU9ORF9IRUxNRVRzcQB+AABz - cQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+ACh1 - cQB+AAYAAAABcQB+ABh1cQB+AAYAAAABcQB+AB0= -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAACdAAKREFNQUdFX0FMTHQAC0ZJUkVfQVNQRUNUdXEAfgAGAAAAAnNyABFqYXZhLmxh - bmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCL - AgAAeHAAAAAFc3EAfgAbAAAAAnNxAH4AAHNxAH4AA3VxAH4ABgAAAARxAH4ACHEAfgAJdAAGZGFt - YWdldAAGYW1vdW50dXEAfgAGAAAABHEAfgAMdAAMR09MREVOX0FQUExFc3IAD2phdmEubGFuZy5T - aG9ydGhNNxM0YNpSAgABUwAFdmFsdWV4cQB+ABwAAXNxAH4AGwAAAEBzcQB+AABzcQB+AAN1cQB+ - AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAAORElBTU9ORF9IRUxNRVRzcQB+ - AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcgA3 - Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVCaU1hcCRTZXJpYWxpemVkRm9ybQAA - AAAAAAAAAgAAeHEAfgADdXEAfgAGAAAAAXQAGFBST1RFQ1RJT05fRU5WSVJPTk1FTlRBTHVxAH4A - BgAAAAFzcQB+ABsAAAADc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4A - BgAAAANxAH4ADHQADURJQU1PTkRfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - EXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ADV0AA9QUk9URUNU - SU9OX0ZBTEx1cQB+AAYAAAACcQB+ADdzcQB+ABsAAAAEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EA - fgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHQAEERJQU1PTkRfTEVHR0lOR1NzcQB+AABzcQB+ - AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+ADJ1cQB+ - AAYAAAABcQB+ADV1cQB+AAYAAAABcQB+ADdzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - CXEAfgAKdXEAfgAGAAAAA3EAfgAMdAASRElBTU9ORF9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAydXEAfgAGAAAA - AXEAfgA1dXEAfgAGAAAAAXEAfgA3cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw diff --git a/core/src/main/resources/1.8.8/ladders/nodebuff.yml b/core/src/main/resources/1.8.8/ladders/nodebuff.yml deleted file mode 100644 index eb5286725..000000000 --- a/core/src/main/resources/1.8.8/ladders/nodebuff.yml +++ /dev/null @@ -1,129 +0,0 @@ -name: NoDebuff -enabled: true -type: BASIC -settings: - regen: true - hunger: true - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: true - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: POTION - damage: 8261 - meta: - ==: ItemMeta - meta-type: POTION - display-name: §aNo Debuff -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAYUFJPVEVDVElPTl9FTlZJUk9OTUVOVEFMdAAKRFVSQUJJTElUWXQAD1BST1RF - Q1RJT05fRkFMTHVxAH4ABgAAAANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZh - bHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAAnNxAH4AHAAAAANzcQB+ABwA - AAAEc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHQA - EERJQU1PTkRfTEVHR0lOR1NzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEA - fgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAAAAJxAH4A - HnEAfgAfc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4A - DHQAEkRJQU1PTkRfQ0hFU1RQTEFURXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ - ABJ1cQB+AAYAAAADcQB+ABRxAH4AFXNxAH4AA3VxAH4ABgAAAAJxAH4AGHEAfgAZdXEAfgAGAAAA - AnEAfgAecQB+AB9zcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAA - A3EAfgAMdAAORElBTU9ORF9IRUxNRVRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEA - fgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAA - AAJxAH4AHnEAfgAf -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAKREFNQUdFX0FMTHQACkRVUkFCSUxJVFl0AAtGSVJFX0FTUEVDVHVxAH4ABgAA - AANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5O - dW1iZXKGrJUdC5TgiwIAAHhwAAAAA3EAfgAec3EAfgAcAAAAAnNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJdAAGYW1vdW50dXEAfgAGAAAAA3EAfgAMdAALRU5ERVJfUEVBUkxzcQB+ABwA - AAAQc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZkYW1hZ2V1cQB+AAYAAAADcQB+ - AAx0AAZQT1RJT05zcgAPamF2YS5sYW5nLlNob3J0aE03EzRg2lICAAFTAAV2YWx1ZXhxAH4AHSBD - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAs - c3EAfgAtICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EA - fgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+ - AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlx - AH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+ - AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4A - BgAAAANxAH4ACHEAfgAJcQB+ACN1cQB+AAYAAAADcQB+AAx0AAtDT09LRURfQkVFRnNxAH4AHAAA - AEBzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ - ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAAD - cQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVx - AH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - CXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANx - AH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABz - cQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1A - JXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4A - LHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANx - AH4ADHEAfgAsc3EAfgAtICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEA - fgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJ - cQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EA - fgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+ - AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNx - AH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAl - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAs - c3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EA - fgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+ - AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlx - AH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+ - AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4A - BgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EA - fgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtQCVz - cQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxz - cQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+ - AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4A - BgAAAANxAH4ADHEAfgAsc3EAfgAtQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEA - fgAqdXEAfgAGAAAAA3EAfgAMcQB+ACxzcQB+AC1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4A - CHEAfgAJcQB+ACp1cQB+AAYAAAADcQB+AAxxAH4ALHNxAH4ALUAlc3EAfgAAc3EAfgADdXEAfgAG - AAAAA3EAfgAIcQB+AAlxAH4AKnVxAH4ABgAAAANxAH4ADHEAfgAsc3EAfgAtICI= -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AAZkYW1hZ2V1cQB+AAYAAAADdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnku - SXRlbVN0YWNrdAAGUE9USU9Oc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpSAgABUwAFdmFsdWV4 - cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAgInNxAH4AAHNxAH4AA3VxAH4ABgAAAANx - AH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAxxAH4ADXNxAH4ADiBDc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHEAfgANc3EAfgAOQCVwc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZhbW91bnR1cQB+AAYAAAADcQB+AAx0AAxCQUtF - RF9QT1RBVE9zcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHEAfgAPAAAA - QHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AB51cQB+AAYAAAADcQB+AAx0AA1H - T0xERU5fQ0FSUk9UcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAedXEA - fgAGAAAAA3EAfgAMdAALQ09PS0VEX0JFRUZxAH4AInBwcHBwcHBwcHBwcHBwcHBwcHBwcA== - ranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AAZhbW91bnR1cQB+AAYAAAADdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnku - SXRlbVN0YWNrdAAMQkFLRURfUE9UQVRPc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJ - AAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAEBzcQB+AABzcQB+AAN1 - cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAANR09MREVOX0NBUlJPVHEA - fgAQc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHQA - C0NPT0tFRF9CRUVGcQB+ABBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw diff --git a/core/src/main/resources/1.8.8/ladders/pearlfight.yml b/core/src/main/resources/1.8.8/ladders/pearlfight.yml deleted file mode 100644 index cff04c41f..000000000 --- a/core/src/main/resources/1.8.8/ladders/pearlfight.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: PearlFight -enabled: true -type: PEARL_FIGHT -settings: - regen: true - hunger: false - ranked: true - editable: true - hitdelay: 20 - rounds: 3 - epcooldown: 0 - startcountdown: 3 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -tempbuild-delay: 6 -icon: - ==: org.bukkit.inventory.ItemStack - type: ENDER_PEARL - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §bPearl Fight -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAANTEVBVEhFUl9CT09UU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAA - AnEAfgALdAAQTEVBVEhFUl9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJ - dXEAfgAGAAAAAnEAfgALdAASTEVBVEhFUl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAA - AnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAt0AA5MRUFUSEVSX0hFTE1FVA== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QACUJMQVpFX1JPRHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHQACW1ldGEtdHlw - ZXQACGVuY2hhbnRzdXEAfgAGAAAAA3QACEl0ZW1NZXRhdAAKVU5TUEVDSUZJQ3NyADdjb20uZ29v - Z2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUJpTWFwJFNlcmlhbGl6ZWRGb3JtAAAAAAAAAAAC - AAB4cQB+AAN1cQB+AAYAAAABdAAJS05PQ0tCQUNLdXEAfgAGAAAAAXNyABFqYXZhLmxhbmcuSW50 - ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAA - AAABc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZhbW91bnR1cQB+AAYAAAADcQB+ - AAx0AAtFTkRFUl9QRUFSTHNxAH4AGwAAAAhzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - CXEAfgAhdXEAfgAGAAAAA3EAfgAMdAAEV09PTHNxAH4AGwAAAAxwcHBwcHBwcHBwcHBwcHBwcHBw - cHBwcHBwcHBwcHBwcHA= diff --git a/core/src/main/resources/1.8.8/ladders/sg.yml b/core/src/main/resources/1.8.8/ladders/sg.yml deleted file mode 100644 index 8058bfd9c..000000000 --- a/core/src/main/resources/1.8.8/ladders/sg.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: SG -enabled: true -type: BUILD -settings: - regen: true - hunger: true - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: FLINT_AND_STEEL - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §aSG -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9CT09UU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAANSVJPTl9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAG - AAAAAnEAfgALdAAPSVJPTl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+ - AAl1cQB+AAYAAAACcQB+AAt0ABBDSEFJTk1BSUxfSEVMTUVU -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9TV09SRHNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAALRklTSElOR19ST0RzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAA - AAJxAH4AC3QAA0JPV3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJdAAGZGFtYWdldXEA - fgAGAAAAA3EAfgALdAAPRkxJTlRfQU5EX1NURUVMc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpS - AgABUwAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAPHNxAH4AAHNxAH4A - A3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgALdAAMR09MREVOX0FQUExFc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZhbW91bnR1cQB+AAYAAAADcQB+AAt0AAxCQUtF - RF9QT1RBVE9zcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHEAfgAeAAAA - BnBwcHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACh1cQB+AAYAAAADcQB+AAt0 - AAVBUlJPV3NxAH4AKwAAAApwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcA== diff --git a/core/src/main/resources/1.8.8/ladders/skywars.yml b/core/src/main/resources/1.8.8/ladders/skywars.yml deleted file mode 100644 index 862e98566..000000000 --- a/core/src/main/resources/1.8.8/ladders/skywars.yml +++ /dev/null @@ -1,142 +0,0 @@ -name: SkyWars -enabled: true -type: SKYWARS -settings: - regen: true - hunger: true - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 10 - startcountdown: 3 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: true - matchtypes: - - PARTY_VS_PARTY - - PARTY_SPLIT - - DUEL -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: EYE_OF_ENDER - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §3SkyWars -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9CT09UU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAANSVJPTl9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAG - AAAAAnEAfgALdAAPSVJPTl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+ - AAl1cQB+AAYAAAACcQB+AAt0AAtJUk9OX0hFTE1FVA== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9TV09SRHNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAALRklTSElOR19ST0RzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAA - AAJxAH4AC3QAC0VOREVSX1BFQVJMc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZh - bW91bnR1cQB+AAYAAAADcQB+AAt0AARXT09Ec3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgC - AAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAEBzcQB+AABzcQB+ - AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4AC3QADFdBVEVSX0JVQ0tFVHNxAH4A - AHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgALdAALTEFWQV9CVUNLRVRz - cQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXQABmRhbWFnZXVxAH4ABgAAAANxAH4AC3QA - BlBPVElPTnNyAA9qYXZhLmxhbmcuU2hvcnRoTTcTNGDaUgIAAVMABXZhbHVleHEAfgAeQCVzcQB+ - AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAadXEAfgAGAAAAA3EAfgALdAAMR09MREVO - X0FQUExFc3EAfgAdAAAAAnNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ABp1cQB+ - AAYAAAADcQB+AAt0AAtDT09LRURfQkVFRnEAfgAfcHBwcHBwcHBwcHBwcHBwcHBzcQB+AABzcQB+ - AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAtdXEAfgAGAAAAA3EAfgALcQB+AC9zcQB+ADBAJXNx - AH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgALdAANU1RPTkVfUElD - S0FYRXNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgALdAAJU1RP - TkVfQVhFc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AGnVxAH4ABgAAAANxAH4A - C3QAA0VHR3NxAH4AHQAAABBzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAadXEA - fgAGAAAAA3EAfgALdAALQ09CQkxFU1RPTkVxAH4AH3BwcHBzcQB+AABzcQB+AAN1cQB+AAYAAAAD - cQB+AAhxAH4ACXEAfgAtdXEAfgAGAAAAA3EAfgALcQB+AC9zcQB+ADBAJQ== -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA= -skywars-loot: | - rO0ABXcEAAAALXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QAA0JPV3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHQACW1ldGEtdHlwZXQACGVu - Y2hhbnRzdXEAfgAGAAAAA3QACEl0ZW1NZXRhdAAKVU5TUEVDSUZJQ3NyADdjb20uZ29vZ2xlLmNv - bW1vbi5jb2xsZWN0LkltbXV0YWJsZUJpTWFwJFNlcmlhbGl6ZWRGb3JtAAAAAAAAAAACAAB4cQB+ - AAN1cQB+AAYAAAABdAAMQVJST1dfREFNQUdFdXEAfgAGAAAAAXNyABFqYXZhLmxhbmcuSW50ZWdl - chLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAC - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAl0AAZhbW91bnR1cQB+AAYAAAADcQB+AAx0 - AAVBUlJPV3NxAH4AGwAAAApzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAhdXEA - fgAGAAAAA3EAfgAMcQB+ACNzcQB+ABsAAAAGc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ - AAlxAH4AIXVxAH4ABgAAAANxAH4ADHEAfgAjc3EAfgAbAAAABHNxAH4AAHNxAH4AA3VxAH4ABgAA - AAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+AA1zcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+ - AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHQAEERJQU1PTkRfTEVHR0lOR1NzcQB+AABzcQB+AAN1cQB+ - AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHQADkRJQU1PTkRfSEVMTUVUc3EAfgAAc3EA - fgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4ADHQABVNUSUNLcQB+AB1z - cQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAhdXEAfgAGAAAAA3EAfgAMdAADV0VC - c3EAfgAbAAAABXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAAD - cQB+AAxxAH4APHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ABJ1cQB+AAYAAAAD - cQB+ABRxAH4AFXNxAH4AFnVxAH4ABgAAAAF0ABhQUk9URUNUSU9OX0VOVklST05NRU5UQUx1cQB+ - AAYAAAABc3EAfgAbAAAAAXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+ - AAYAAAADcQB+AAx0ABJESUFNT05EX0NIRVNUUExBVEVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+ - AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+ABZ1cQB+AAYAAAABcQB+AFJ1cQB+ - AAYAAAABcQB+AFRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAA - A3EAfgAMcQB+ADdzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAA - A3EAfgAUcQB+ABVzcQB+ABZ1cQB+AAYAAAABcQB+AFJ1cQB+AAYAAAABcQB+AFRzcQB+AABzcQB+ - AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAANRElBTU9ORF9CT09U - U3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ABJ1cQB+AAYAAAADcQB+ABRxAH4A - FXNxAH4AFnVxAH4ABgAAAAFxAH4AUnVxAH4ABgAAAAFxAH4AVHNxAH4AAHNxAH4AA3VxAH4ABgAA - AAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMdAANRElBTU9ORF9TV09SRHNxAH4AAHNxAH4AA3Vx - AH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMdAAPRElBTU9ORF9QSUNLQVhFc3EAfgAA - c3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAx0AAtESUFNT05EX0FYRXNx - AH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJdAAGZGFtYWdldXEAfgAGAAAAA3EAfgAMdAAG - UE9USU9Oc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpSAgABUwAFdmFsdWV4cQB+ABxAI3NxAH4A - AHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AIp1cQB+AAYAAAADcQB+AAxxAH4AjHNxAH4A - jSAjc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AinVxAH4ABgAAAANxAH4ADHEA - fgCMc3EAfgCNQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgCKdXEAfgAGAAAA - A3EAfgAMcQB+AIxzcQB+AI1AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AIp1 - cQB+AAYAAAADcQB+AAxxAH4AjHNxAH4AjUAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ - AAlxAH4AinVxAH4ABgAAAANxAH4ADHEAfgCMc3EAfgCNQARzcQB+AABzcQB+AAN1cQB+AAYAAAAD - cQB+AAhxAH4ACXEAfgCKdXEAfgAGAAAAA3EAfgAMcQB+AIxzcQB+AI1AAnNxAH4AAHNxAH4AA3Vx - AH4ABgAAAANxAH4ACHEAfgAJcQB+AIp1cQB+AAYAAAADcQB+AAxxAH4AjHNxAH4AjSABc3EAfgAA - c3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AinVxAH4ABgAAAANxAH4ADHEAfgCMc3EAfgCN - QAFzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAAK - SVJPTl9TUEFERXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ABJ1cQB+AAYAAAAD - cQB+ABRxAH4AFXNxAH4AFnVxAH4ABgAAAAF0AAlESUdfU1BFRUR1cQB+AAYAAAABcQB+AB1zcQB+ - AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAAISVJPTl9B - WEVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAGAAAAA3EAfgAUcQB+ - ABVzcQB+ABZ1cQB+AAYAAAABcQB+AMJ1cQB+AAYAAAABcQB+AB1zcQB+AABzcQB+AAN1cQB+AAYA - AAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMdAAMSVJPTl9QSUNLQVhFc3EAfgAAc3EA - fgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAAAANxAH4AFHEAfgAVc3EAfgAWdXEA - fgAGAAAAAXEAfgDCdXEAfgAGAAAAAXEAfgAdc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ - AAlxAH4AIXVxAH4ABgAAAANxAH4ADHQAB0RJQU1PTkRxAH4AHXNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJcQB+ACF1cQB+AAYAAAADcQB+AAx0AAxHT0xERU5fQVBQTEVzcQB+ABsAAAAD - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4ADHEAfgDl - cQB+AB1zcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgDl - c3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4ADHQAA0VH - R3EAfgAuc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4A - DHEAfgDzc3EAfgAbAAAACHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACF1cQB+ - AAYAAAADcQB+AAxxAH4A83NxAH4AGwAAABBzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4A - CXVxAH4ABgAAAAJxAH4ADHQAC0xBVkFfQlVDS0VUc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAI - cQB+AAl1cQB+AAYAAAACcQB+AAxxAH4BAnNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJ - dXEAfgAGAAAAAnEAfgAMdAAPRkxJTlRfQU5EX1NURUVMc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EA - fgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4ADHQAA1ROVHEAfgAdc3EAfgAAc3EAfgADdXEAfgAG - AAAAA3EAfgAIcQB+AAlxAH4AIXVxAH4ABgAAAANxAH4ADHEAfgEQcQB+AC5zcQB+AABzcQB+AAN1 - cQB+AAYAAAADcQB+AAhxAH4ACXEAfgCKdXEAfgAGAAAAA3EAfgAMcQB+AIxzcQB+AI1AKnNxAH4A - AHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AIp1cQB+AAYAAAADcQB+AAxxAH4AjHNxAH4A - jUBMc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AinVxAH4ABgAAAANxAH4ADHEA - fgCMc3EAfgCNQAtzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAA - A3EAfgAMdAANR09MRF9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgARcQB+ - ABJ1cQB+AAYAAAADcQB+ABRxAH4AFXNxAH4AFnVxAH4ABgAAAAFxAH4AUnVxAH4ABgAAAAFxAH4A - 5nNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0AA9H - T0xEX0NIRVNUUExBVEVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEAfgAG - AAAAA3EAfgAUcQB+ABVzcQB+ABZ1cQB+AAYAAAABcQB+AFJ1cQB+AAYAAAABcQB+AOY= diff --git a/core/src/main/resources/1.8.8/ladders/soup.yml b/core/src/main/resources/1.8.8/ladders/soup.yml deleted file mode 100644 index cd0ca3487..000000000 --- a/core/src/main/resources/1.8.8/ladders/soup.yml +++ /dev/null @@ -1,94 +0,0 @@ -name: Soup -enabled: true -type: BASIC -settings: - regen: false - hunger: false - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: true - matchtypes: - - DUEL - - PARTY_SPLIT - - PARTY_VS_PARTY - - PARTY_FFA -effects: -- ==: PotionEffect - effect: 1 - duration: 4800 - amplifier: 1 - ambient: false - has-particles: true -- ==: PotionEffect - effect: 5 - duration: 4800 - amplifier: 1 - ambient: false - has-particles: true -icon: - ==: org.bukkit.inventory.ItemStack - type: MUSHROOM_SOUP - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §6Soup -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAJ0AAI9PXQABHR5cGV1cQB+AAYAAAACdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnkuSXRlbVN0YWNr - dAAKSVJPTl9CT09UU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgALdAANSVJPTl9MRUdHSU5HU3NxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAG - AAAAAnEAfgALdAAPSVJPTl9DSEVTVFBMQVRFc3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+ - AAl1cQB+AAYAAAACcQB+AAt0AAtJUk9OX0hFTE1FVA== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcgA3Y29t - Lmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVCaU1hcCRTZXJpYWxpemVkRm9ybQAAAAAA - AAAAAgAAeHEAfgADdXEAfgAGAAAAAXQACkRBTUFHRV9BTEx1cQB+AAYAAAABc3IAEWphdmEubGFu - Zy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsC - AAB4cAAAAAFzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHQA - DU1VU0hST09NX1NPVVBzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJx - AH4ADHEAfgAic3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxx - AH4AInNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJz - cQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgAic3EAfgAA - c3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AInNxAH4AAHNxAH4A - A3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+ - AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgAic3EAfgAAc3EAfgADdXEAfgAGAAAA - AnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AInNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4A - CHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4A - CXVxAH4ABgAAAAJxAH4ADHEAfgAic3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+ - AAYAAAACcQB+AAxxAH4AInNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAA - AnEAfgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4A - DHEAfgAic3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4A - InNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+ - AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgAic3EAfgAAc3EA - fgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AInNxAH4AAHNxAH4AA3Vx - AH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYA - AAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgAic3EAfgAAc3EAfgADdXEAfgAGAAAAAnEA - fgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AInNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEA - fgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVx - AH4ABgAAAAJxAH4ADHEAfgAic3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYA - AAACcQB+AAxxAH4AInNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEA - fgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEA - fgAic3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AInNx - AH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+AABz - cQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgAic3EAfgAAc3EAfgAD - dXEAfgAGAAAAAnEAfgAIcQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AInNxAH4AAHNxAH4AA3VxAH4A - BgAAAAJxAH4ACHEAfgAJdXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYAAAAC - cQB+AAhxAH4ACXVxAH4ABgAAAAJxAH4ADHEAfgAic3EAfgAAc3EAfgADdXEAfgAGAAAAAnEAfgAI - cQB+AAl1cQB+AAYAAAACcQB+AAxxAH4AInNxAH4AAHNxAH4AA3VxAH4ABgAAAAJxAH4ACHEAfgAJ - dXEAfgAGAAAAAnEAfgAMcQB+ACJzcQB+AABzcQB+AAN1cQB+AAYAAAACcQB+AAhxAH4ACXVxAH4A - BgAAAAJxAH4ADHEAfgAi diff --git a/core/src/main/resources/1.8.8/ladders/spleef.yml b/core/src/main/resources/1.8.8/ladders/spleef.yml deleted file mode 100644 index 09a20229a..000000000 --- a/core/src/main/resources/1.8.8/ladders/spleef.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Spleef -enabled: true -type: SPLEEF -settings: - regen: true - hunger: false - ranked: true - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 3 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: DIAMOND_SPADE - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §3Spleef -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAR0AAI9PXQABHR5cGV0AAZkYW1hZ2V0AAZhbW91bnR1cQB+AAYAAAAEdAAeb3JnLmJ1a2tpdC5p - bnZlbnRvcnkuSXRlbVN0YWNrdAADQUlSc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpSAgABUwAF - dmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHD//3NyABFqYXZhLmxhbmcuSW50 - ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cQB+ABAAAAAAc3EAfgAAc3EAfgADdXEAfgAGAAAABHEA - fgAIcQB+AAlxAH4ACnEAfgALdXEAfgAGAAAABHEAfgANcQB+AA5xAH4AEXEAfgATc3EAfgAAc3EA - fgADdXEAfgAGAAAABHEAfgAIcQB+AAlxAH4ACnEAfgALdXEAfgAGAAAABHEAfgANcQB+AA5xAH4A - EXEAfgATc3EAfgAAc3EAfgADdXEAfgAGAAAABHEAfgAIcQB+AAlxAH4ACnEAfgALdXEAfgAGAAAA - BHEAfgANcQB+AA5xAH4AEXEAfgAT -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1BBREVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAACdAAJRElHX1NQRUVEdAAKRFVSQUJJTElUWXVxAH4ABgAAAAJzcgARamF2YS5sYW5n - LkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIA - AHhwAAAABXNxAH4AGwAAAANwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcA== -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1BBREVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAACdAAJRElHX1NQRUVEdAAKRFVSQUJJTElUWXVxAH4ABgAAAAJzcgARamF2YS5sYW5n - LkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIA - AHhwAAAABXNxAH4AGwAAAANzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEA - fgAGAAAAA3EAfgAMdAAKSVJPTl9TUEFERXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAR - cQB+ABJ1cQB+AAYAAAADcQB+ABRxAH4AFXNxAH4AA3VxAH4ABgAAAAJxAH4AGHEAfgAZdXEAfgAG - AAAAAnEAfgAdcQB+AB5zcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAG - AAAAA3EAfgAMdAALU1RPTkVfU1BBREVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEA - fgASdXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAA - AAJxAH4AHXEAfgAec3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAA - AANxAH4ADHQACkdPTERfU1BBREVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgAS - dXEAfgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAAAAJx - AH4AHXEAfgAec3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANx - AH4ADHQACldPT0RfU1BBREVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEA - fgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAAAAJxAH4A - HXEAfgAecHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA= diff --git a/core/src/main/resources/1.8.8/ladders/sumo.yml b/core/src/main/resources/1.8.8/ladders/sumo.yml deleted file mode 100644 index 6febb4a8f..000000000 --- a/core/src/main/resources/1.8.8/ladders/sumo.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Sumo -enabled: true -type: SUMO -settings: - regen: false - hunger: false - ranked: true - editable: false - hitdelay: 20 - rounds: 3 - epcooldown: 13 - startcountdown: 3 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL -effects: [] -icon: - ==: org.bukkit.inventory.ItemStack - type: STICK - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: §6Sumo -armor: | - rO0ABXcEAAAABHBwcHA= -inventory: | - rO0ABXcEAAAAJHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcA== -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA= diff --git a/core/src/main/resources/1.8.8/ladders/vanilla.yml b/core/src/main/resources/1.8.8/ladders/vanilla.yml deleted file mode 100644 index 4c1a93d44..000000000 --- a/core/src/main/resources/1.8.8/ladders/vanilla.yml +++ /dev/null @@ -1,126 +0,0 @@ -name: Vanilla -enabled: true -type: BASIC -settings: - regen: true - hunger: true - ranked: false - editable: true - hitdelay: 20 - rounds: 1 - epcooldown: 13 - startcountdown: 5 - knockback: DEFAULT - gacooldown: 0 - drop-inventory: false - matchtypes: - - DUEL - - PARTY_FFA - - PARTY_SPLIT - - PARTY_VS_PARTY -effects: [] -armor: | - rO0ABXcEAAAABHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfQk9PVFNzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAYUFJPVEVDVElPTl9FTlZJUk9OTUVOVEFMdAAKRFVSQUJJTElUWXQAD1BST1RF - Q1RJT05fRkFMTHVxAH4ABgAAAANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZh - bHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAABHNxAH4AHAAAAANxAH4AHnNx - AH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABBESUFN - T05EX0xFR0dJTkdTc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVxAH4ABgAA - AANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAACcQB+AB5xAH4A - H3NxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAx0ABJE - SUFNT05EX0NIRVNUUExBVEVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4AEXEAfgASdXEA - fgAGAAAAA3EAfgAUcQB+ABVzcQB+AAN1cQB+AAYAAAACcQB+ABhxAH4AGXVxAH4ABgAAAAJxAH4A - HnEAfgAfc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4A - DHQADkRJQU1PTkRfSEVMTUVUc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+ABFxAH4AEnVx - AH4ABgAAAANxAH4AFHEAfgAVc3EAfgADdXEAfgAGAAAAAnEAfgAYcQB+ABl1cQB+AAYAAAACcQB+ - AB5xAH4AHw== -inventory: | - rO0ABXcEAAAAJHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AARtZXRhdXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0 - ZW1TdGFja3QADURJQU1PTkRfU1dPUkRzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAh0AAltZXRh - LXR5cGV0AAhlbmNoYW50c3VxAH4ABgAAAAN0AAhJdGVtTWV0YXQAClVOU1BFQ0lGSUNzcQB+AAN1 - cQB+AAYAAAADdAAKREFNQUdFX0FMTHQACkRVUkFCSUxJVFl0AAtGSVJFX0FTUEVDVHVxAH4ABgAA - AANzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5O - dW1iZXKGrJUdC5TgiwIAAHhwAAAABXNxAH4AHAAAAANzcQB+ABwAAAACc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+AAl0AAZhbW91bnR1cQB+AAYAAAADcQB+AAx0AAtFTkRFUl9QRUFSTHNx - AH4AHAAAABBzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXQABmRhbWFnZXVxAH4ABgAA - AANxAH4ADHQABlBPVElPTnNyAA9qYXZhLmxhbmcuU2hvcnRoTTcTNGDaUgIAAVMABXZhbHVleHEA - fgAdIENzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgArdXEAfgAGAAAAA3EAfgAM - cQB+AC1zcQB+AC4gInNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACt1cQB+AAYA - AAADcQB+AAxxAH4ALXNxAH4ALiApc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4A - K3VxAH4ABgAAAANxAH4ADHEAfgAtc3EAfgAuIEFzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhx - AH4ACXEAfgArdXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+AC5AJXNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJcQB+ACt1cQB+AAYAAAADcQB+AAxxAH4ALXNxAH4ALkAlc3EAfgAAc3EAfgAD - dXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AJHVxAH4ABgAAAANxAH4ADHQAC0NPT0tFRF9CRUVGc3EA - fgAcAAAAQHNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACt1cQB+AAYAAAADcQB+ - AAxxAH4ALXNxAH4ALkBKc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AK3VxAH4A - BgAAAANxAH4ADHEAfgAtc3EAfgAuQEpzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEA - fgArdXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+AC5AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4A - CHEAfgAJcQB+ACt1cQB+AAYAAAADcQB+AAxxAH4ALXNxAH4ALkAlc3EAfgAAc3EAfgADdXEAfgAG - AAAAA3EAfgAIcQB+AAlxAH4AK3VxAH4ABgAAAANxAH4ADHEAfgAtc3EAfgAuQCVzcQB+AABzcQB+ - AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgArdXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+AC5AJXNx - AH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACt1cQB+AAYAAAADcQB+AAxxAH4ALXNx - AH4ALkAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AK3VxAH4ABgAAAANxAH4A - DHEAfgAtc3EAfgAuQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgArdXEAfgAG - AAAAA3EAfgAMcQB+AC1zcQB+AC5AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ - ACt1cQB+AAYAAAADcQB+AAxxAH4ALXNxAH4ALkAhc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAI - cQB+AAlxAH4AK3VxAH4ABgAAAANxAH4ADHEAfgAtc3EAfgAuQEhzcQB+AABzcQB+AAN1cQB+AAYA - AAADcQB+AAhxAH4ACXEAfgArdXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+AC5AJXNxAH4AAHNxAH4A - A3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACt1cQB+AAYAAAADcQB+AAxxAH4ALXNxAH4ALkAlc3EA - fgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AK3VxAH4ABgAAAANxAH4ADHEAfgAtc3EA - fgAuQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgArdXEAfgAGAAAAA3EAfgAM - cQB+AC1zcQB+AC5AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACt1cQB+AAYA - AAADcQB+AAxxAH4ALXNxAH4ALiBBc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4A - K3VxAH4ABgAAAANxAH4ADHEAfgAtc3EAfgAuICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhx - AH4ACXEAfgArdXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+AC4gKXNxAH4AAHNxAH4AA3VxAH4ABgAA - AANxAH4ACHEAfgAJcQB+ACt1cQB+AAYAAAADcQB+AAxxAH4ALXNxAH4ALkBEc3EAfgAAc3EAfgAD - dXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AK3VxAH4ABgAAAANxAH4ADHEAfgAtc3EAfgAuQCRzcQB+ - AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgArdXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+ - AC5AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+ACt1cQB+AAYAAAADcQB+AAxx - AH4ALXNxAH4ALkAlc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4AK3VxAH4ABgAA - AANxAH4ADHEAfgAtc3EAfgAuQCVzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAr - dXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+AC5AJXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEA - fgAJcQB+ACt1cQB+AAYAAAADcQB+AAxxAH4ALXNxAH4ALiBBc3EAfgAAc3EAfgADdXEAfgAGAAAA - A3EAfgAIcQB+AAlxAH4AK3VxAH4ABgAAAANxAH4ADHEAfgAtc3EAfgAuICJzcQB+AABzcQB+AAN1 - cQB+AAYAAAADcQB+AAhxAH4ACXEAfgArdXEAfgAGAAAAA3EAfgAMcQB+AC1zcQB+AC4gKQ== -custom-kit-extra-items: - unranked: | - rO0ABXcEAAAAHHNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFw - dAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFi - bGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmpl - Y3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAA - AAN0AAI9PXQABHR5cGV0AAZkYW1hZ2V1cQB+AAYAAAADdAAeb3JnLmJ1a2tpdC5pbnZlbnRvcnku - SXRlbVN0YWNrdAAGUE9USU9Oc3IAD2phdmEubGFuZy5TaG9ydGhNNxM0YNpSAgABUwAFdmFsdWV4 - cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHBASnNxAH4AAHNxAH4AA3VxAH4ABgAAAANx - AH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAxxAH4ADXNxAH4ADkBEc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHEAfgANc3EAfgAOQEhzcQB+AABz - cQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMcQB+AA1zcQB+AA5A - IXNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAxxAH4A - DXNxAH4ADkAkc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANx - AH4ADHEAfgANc3EAfgAOQCVwc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVx - AH4ABgAAAANxAH4ADHEAfgANc3EAfgAOICJzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4A - CXEAfgAKdXEAfgAGAAAAA3EAfgAMcQB+AA1zcQB+AA4gKXNxAH4AAHNxAH4AA3VxAH4ABgAAAANx - AH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAxxAH4ADXNxAH4ADiBDc3EAfgAAc3EAfgADdXEA - fgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAAAANxAH4ADHEAfgANc3EAfgAOICFwcHBzcQB+ - AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAKdXEAfgAGAAAAA3EAfgAMcQB+AA1zcQB+ - AA5AInNxAH4AAHNxAH4AA3VxAH4ABgAAAANxAH4ACHEAfgAJcQB+AAp1cQB+AAYAAAADcQB+AAxx - AH4ADXNxAH4ADkApc3EAfgAAc3EAfgADdXEAfgAGAAAAA3EAfgAIcQB+AAlxAH4ACnVxAH4ABgAA - AANxAH4ADHEAfgANc3EAfgAOQENzcQB+AABzcQB+AAN1cQB+AAYAAAADcQB+AAhxAH4ACXEAfgAK - dXEAfgAGAAAAA3EAfgAMcQB+AA1zcQB+AA5AQXBwcHBwcHBwcHA= -icon: - ==: org.bukkit.inventory.ItemStack - type: POTION - damage: 8257 - meta: - ==: ItemMeta - meta-type: POTION - display-name: §dVanilla diff --git a/core/src/main/resources/1.8.8/playerkit.yml b/core/src/main/resources/1.8.8/playerkit.yml deleted file mode 100644 index d648f882d..000000000 --- a/core/src/main/resources/1.8.8/playerkit.yml +++ /dev/null @@ -1,635 +0,0 @@ -VERSION: 2 - -GUI: - MAIN: - TITLE: "&8%name%" - ICONS: - BACK-TO: - NAME: "&7&lBack" - MATERIAL: ARROW - LORE: - - "&7Click to go back" - CUSTOM-SETTINGS: - NAME: "&bCustom Settings" - MATERIAL: REDSTONE - GUIDE: - NAME: "&b&lGuide" - MATERIAL: PAPER - LORE: - - "&fLeft click to change item" - - "&fShit left click to remove item" - - "&fRight click to enchant or change count" - - "&fShift right click to copy or paste item" - RESET-KIT: - NAME: "&cReset Kit" - MATERIAL: BLAZE_POWDER - CHANGE-NAME: - NAME: "&bChange the name of kit" - MATERIAL: NAME_TAG - SHARE-KIT: - NAME: "&bShare Kit" - MATERIAL: SIGN - KIT-SLOT-PLACEHOLDERS: - HEAD: - NAME: "&7Head" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 11 - LORE: - - "&3Click to add" - CHEST: - NAME: "&7Chest" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 11 - LORE: - - "&3Click to add" - LEGS: - NAME: "&7Legs" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 11 - LORE: - - "&3Click to add" - BOOTS: - NAME: "&7Feet" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 11 - LORE: - - "&3Click to add" - OFFHAND: - NAME: "&7Offhand" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 11 - LORE: - - "&3Click to add" - HOTBAR: - NAME: "&7None" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 3 - LORE: - - "&3Click to add" - OTHER-INVENTORY: - NAME: "&7None" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - LORE: - - "&3Click to add" - MAIN-ARMOR: - TITLE: "&8Armor" - SIZE: 6 - ICONS: - OFFICIAL: - BACK-TO: - NAME: "&7&lBack" - MATERIAL: ARROW - SLOT: 45 - LORE: - - "&7Click to go back" - NONE: - NAME: "&7None" - SLOT: 18 - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - HELMETS: - LEATHER: - MATERIAL: LEATHER_HELMET - SLOT: 19 - GOLD: - MATERIAL: GOLD_HELMET - SLOT: 20 - CHAIN: - MATERIAL: CHAINMAIL_HELMET - SLOT: 21 - IRON: - MATERIAL: IRON_HELMET - SLOT: 22 - DIAMOND: - MATERIAL: DIAMOND_HELMET - SLOT: 23 - CHESTPLATES: - LEATHER: - MATERIAL: LEATHER_CHESTPLATE - SLOT: 19 - GOLD: - MATERIAL: GOLD_CHESTPLATE - SLOT: 20 - CHAIN: - MATERIAL: CHAINMAIL_CHESTPLATE - SLOT: 21 - IRON: - MATERIAL: IRON_CHESTPLATE - SLOT: 22 - DIAMOND: - MATERIAL: DIAMOND_CHESTPLATE - SLOT: 23 - LEGGINGS: - LEATHER: - MATERIAL: LEATHER_LEGGINGS - SLOT: 19 - GOLD: - MATERIAL: GOLD_LEGGINGS - SLOT: 20 - CHAIN: - MATERIAL: CHAINMAIL_LEGGINGS - SLOT: 21 - IRON: - MATERIAL: IRON_LEGGINGS - SLOT: 22 - DIAMOND: - MATERIAL: DIAMOND_LEGGINGS - SLOT: 23 - BOOTS: - LEATHER: - MATERIAL: LEATHER_BOOTS - SLOT: 19 - GOLD: - MATERIAL: GOLD_BOOTS - SLOT: 20 - CHAIN: - MATERIAL: CHAINMAIL_BOOTS - SLOT: 21 - IRON: - MATERIAL: IRON_BOOTS - SLOT: 22 - DIAMOND: - MATERIAL: DIAMOND_BOOTS - SLOT: 23 - CUSTOM-SETTINGS: - TITLE: "&8Settings" - ICONS: - NAV: - GO-BACK: - NAME: "&cGo Back" - MATERIAL: ARROW - NORMAL-SETTINGS: - REGENERATION: - ENABLED: - NAME: "&7Regeneration: &aEnabled" - MATERIAL: GLOWSTONE_DUST - LORE: - - "" - - "&7Players health is automatically regenerate." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Regeneration: &cDisabled" - MATERIAL: GLOWSTONE_DUST - LORE: - - "" - - "&7Players health is not regenerate." - - "" - - "&e&lClick here &7to &aenable&7." - HUNGER: - ENABLED: - NAME: "&7Hunger: &aEnabled" - MATERIAL: COOKED_BEEF - LORE: - - "" - - "&7Players starve during the game." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Hunger: &cDisabled" - MATERIAL: COOKED_BEEF - LORE: - - "" - - "&7Players don't starve." - - "" - - "&e&lClick here &7to &aenable&7." - BUILD: - ENABLED: - NAME: "&7Build: &aEnabled" - MATERIAL: DIAMOND_PICKAXE - LORE: - - "" - - "&7Players can build during the game." - - "" - - "&e&lClick here &7to &cdisable&7." - DISABLED: - NAME: "&7Build: &cDisabled" - MATERIAL: DIAMOND_PICKAXE - LORE: - - "" - - "&7Players can't build." - - "" - - "&e&lClick here &7to &aenable&7." - ROUNDS: - NAME: "&7Rounds: &6%rounds%" - MATERIAL: FIREWORK_CHARGE - LORE: - - "" - - "&7The first player/team to reach" - - "&7the, winning rounds wins." - - "" - - "&a&lLEFT-CLICK &ato reduce the rounds." - - "&b&lRIGHT-CLICK &bto increase the rounds." - KNOCKBACK: - NAME: "&eKnockback Modifier" - MATERIAL: STICK - LORE: - - "" - - "%knockbackTypes%" - HITDELAY: - NAME: "&7Hitdelay: &6%hitdelay% tick" - MATERIAL: DIAMOND_SWORD - LORE: - - "" - - "&7Players can hit each other" - - "&7at these intervals." - - "" - - "&c&lNote: &71 sec = 20 tick" - - "" - - "&a&lLEFT-CLICK &ato reduce the rounds." - - "&b&lRIGHT-CLICK &bto increase the rounds." - ENDERPEARL-COOLDOWN: - NAME: "&7EnderPearl Cooldown: &6%epCooldown% sec" - MATERIAL: ENDER_PEARL - LORE: - - "" - - "&7Players must wait this long before" - - "&7they can throw the next enderpearl." - - "" - - "&a&lLEFT-CLICK &ato reduce the cooldown." - - "&b&lRIGHT-CLICK &bto increase the cooldown." - GOLDENAPPLE-COOLDOWN: - NAME: "&7Golden Apple Cooldown: &6%gaCooldown%" - MATERIAL: GOLDEN_APPLE - LORE: - - "" - - "&7Players must wait this long before" - - "&7they can consume the next golden apple." - - "" - - "&7This setting includes both enchanted" - - "&7and non-enchanted golden apples." - - "" - - "&a&lLEFT-CLICK &ato reduce the cooldown." - - "&b&lRIGHT-CLICK &bto increase the cooldown." - ITEMS: - CATEGORY-GUI: - TITLE: "&8Item categories" - SIZE: 6 - ICONS: - BACK-TO: - NAME: "&7&lBack" - MATERIAL: ARROW - SLOT: 45 - LORE: - - "&7Click to go back" - NONE: - NAME: "&bNone" - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 7 - SLOT: 18 - ARMOR: - NAME: "&bArmor" - MATERIAL: DIAMOND_CHESTPLATE - SLOT: 19 - WEAPONS-TOOLS: - NAME: "&bWeapons & Tools" - MATERIAL: IRON_SWORD - SLOT: 20 - BOWS-ARROWS: - NAME: "&bBows & Arrows" - MATERIAL: BOW - SLOT: 21 - POTIONS: - NAME: "&bPotions" - MATERIAL: POTION - DAMAGE: 8229 - SLOT: 22 - FOOD: - NAME: "&bFood" - MATERIAL: COOKED_BEEF - SLOT: 23 - BLOCKS: - NAME: "&bBlocks" - MATERIAL: COBBLESTONE - SLOT: 24 - ITEMS-GUI: - SIZE: 6 - OFFICIAL-ICONS: - BACK-TO: - NAME: "&7&lBack" - MATERIAL: ARROW - LORE: - - "&7Click to go back" - NEXT-PAGE: - NAME: "&7&lNext Page" - MATERIAL: ARROW - LORE: - - "&7Click" - PREVIOUS-PAGE: - NAME: "&7&lPrevious Page" - MATERIAL: ARROW - LORE: - - "&7Click" - CATEGORIES: - ARMOR: - TITLE: "&8Armor" - ITEMS: - - "LEATHER_HELMET" - - "GOLD_HELMET" - - "CHAINMAIL_HELMET" - - "IRON_HELMET" - - "DIAMOND_HELMET" - - "" - - "" - - "" - - "" - - "LEATHER_CHESTPLATE" - - "GOLD_CHESTPLATE" - - "CHAINMAIL_CHESTPLATE" - - "IRON_CHESTPLATE" - - "DIAMOND_CHESTPLATE" - - "" - - "" - - "" - - "" - - "LEATHER_LEGGINGS" - - "GOLD_LEGGINGS" - - "CHAINMAIL_LEGGINGS" - - "IRON_LEGGINGS" - - "DIAMOND_LEGGINGS" - - "" - - "" - - "" - - "" - - "LEATHER_BOOTS" - - "GOLD_BOOTS" - - "CHAINMAIL_BOOTS" - - "IRON_BOOTS" - - "DIAMOND_BOOTS" - WEAPONS-TOOLS: - TITLE: "&8Weapons and Tools" - ITEMS: - - "WOOD_SWORD" - - "GOLD_SWORD" - - "STONE_SWORD" - - "IRON_SWORD" - - "DIAMOND_SWORD" - - "BUCKET" - - "WATER_BUCKET" - - "LAVA_BUCKET" - - "MILK_BUCKET" - - "WOOD_AXE" - - "GOLD_AXE" - - "STONE_AXE" - - "IRON_AXE" - - "DIAMOND_AXE" - - "FLINT_AND_STEEL" - - "SHEARS" - - "FISHING_ROD" - - "EXP_BOTTLE" - - "WOOD_PICKAXE" - - "GOLD_PICKAXE" - - "STONE_PICKAXE" - - "IRON_PICKAXE" - - "DIAMOND_PICKAXE" - - "SNOW_BALL" - - "ENDER_PEARL" - - "" - - "" - - "WOOD_SPADE" - - "GOLD_SPADE" - - "STONE_SPADE" - - "IRON_SPADE" - - "DIAMOND_SPADE" - - "" - - "" - - "" - - "" - - "WOOD_HOE" - - "GOLD_HOE" - - "STONE_HOE" - - "IRON_HOE" - - "DIAMOND_HOE" - BOWS-ARROWS: - TITLE: "&8Bows and Arrows" - ITEMS: - - "BOW" - - "ARROW" - POTION: - TITLE: "&8Potions" - OFFICIAL-ICONS: - BACK-TO: - NAME: "&7&lBack" - MATERIAL: ARROW - LORE: - - "&7Click to go back" - SWITCH-TO-SPLASH: - NAME: "&bShow splash potions" - MATERIAL: POTION - DAMAGE: 16421 - SWITCH-TO-DRINKABLE: - NAME: "&bShow drinkable potions" - MATERIAL: POTION - DAMAGE: 8229 - DRINKABLE-POTIONS: - ITEMS: - - "POTION::8230" # Night Vision (3:00) - - "POTION::8262" # Long Night Vision (8:00) - - "POTION::8238" # Invisibility (3:00) - - "POTION::8270" # Long Invisibility (8:00) - - "POTION::8203" # Leaping (3:00 - Jump Boost) - - "POTION::8235" # Long Leaping (1:30 - Jump Boost II) - - "POTION::8201" # Strength (3:00) - - "POTION::8233" # Strength II (1:30) - - "POTION::8227" # Fire Resistance (3:00) - - "POTION::8259" # Long Fire Resistance (8:00) - - "POTION::8194" # Swiftness (3:00) - - "POTION::8258" # Long Swiftness (8:00) - - "POTION::8234" # Slowness (1:30) - - "POTION::8266" # Long Slowness (4:00) - - "POTION::8237" # Water Breathing (3:00) - - "POTION::8269" # Long Water Breathing (8:00) - - "POTION::8229" # Healing (Instant Health II) - - "POTION::8261" # Healing (Instant Health) - - "POTION::8196" # Poison (0:45) - - "POTION::8260" # Long Poison (1:30/2:00) - - "POTION::8236" # Harming (Instant Damage II) - - "POTION::8268" # Harming (Instant Damage) - - "POTION::8193" # Regeneration (0:45) - - "POTION::8257" # Long Regeneration (1:30/2:00) - - "POTION::8202" # Weakness (1:30) - - "POTION::8264" # Long Weakness (4:00) - - "POTION::8225" # Regeneration II (0:22) - SPLASH-POTIONS: - ITEMS: - - "POTION::16422" # Night Vision (3:00) - - "POTION::16454" # Long Night Vision (8:00) - - "POTION::16430" # Invisibility (3:00) - - "POTION::16462" # Long Invisibility (8:00) - - "POTION::16395" # Leaping (3:00 - Jump Boost) - - "POTION::16427" # Long Leaping (1:30 - Jump Boost II) - - "POTION::16393" # Strength (3:00) - - "POTION::16425" # Strength II (1:30) - - "POTION::16419" # Fire Resistance (3:00) - - "POTION::16451" # Long Fire Resistance (8:00) - - "POTION::16386" # Swiftness (3:00) - - "POTION::16450" # Long Swiftness (8:00) - - "POTION::16426" # Slowness (1:30) - - "POTION::16458" # Long Slowness (4:00) - - "POTION::16429" # Water Breathing (3:00) - - "POTION::16461" # Long Water Breathing (8:00) - - "POTION::16421" # Healing (Instant Health II) - - "POTION::16453" # Healing (Instant Health) - - "POTION::16388" # Poison (0:45) - - "POTION::16452" # Long Poison (1:30) - - "POTION::16428" # Harming (Instant Damage II) - - "POTION::16460" # Harming (Instant Damage) - - "POTION::16385" # Regeneration (0:45) - - "POTION::16449" # Long Regeneration (1:30) - - "POTION::16424" # Weakness (1:30) - - "POTION::16456" # Long Weakness (4:00) - FOOD: - TITLE: "&8Food" - ITEMS: - - "APPLE" - - "MUSHROOM_SOUP" - - "BREAD" - - "PORK" - - "GRILLED_PORK" - - "GOLDEN_APPLE" - - "GOLDEN_APPLE::1" - - "CAKE" - - "COOKIE" - - "RAW_BEEF" - - "COOKED_BEEF" - - "RAW_CHICKEN" - - "COOKED_CHICKEN" - - "ROTTEN_FLESH" - - "SPIDER_EYE" - - "BAKED_POTATO" - - "GOLDEN_CARROT" - - "PUMPKIN_PIE" - - "RABBIT" - - "COOKED_RABBIT" - - "RABBIT_STEW" - - "MUTTON" - - "COOKED_MUTTON" - BLOCKS: - TITLE: "&8Blocks" - ITEMS: - - "OBSIDIAN" - - "ANVIL" - - "ENCHANTMENT_TABLE" - - "ENDER_CHEST" - - "ENDER_STONE" - - "COBBLESTONE" - - "COAL_BLOCK" - - "IRON_BLOCK" - - "GOLD_BLOCK" - - "DIAMOND_BLOCK" - - "EMERALD_BLOCK" - - "IRON_DOOR" - - "WEB" - - "WOOD" - - "LAPIS_BLOCK" - - "WORKBENCH" - - "LOG" - - "PUMPKIN" - - "MELON" - - "SANDSTONE" - - "WOOL" - - "STONE" - - "QUARTZ_BLOCK" - - "GRAVEL" - - "CLAY" - - "SPONGE" - - "PACKED_ICE" - - "SOUL_SAND" - - "HAY_BLOCK" - - "DIRT" - - "SAND" - - "ICE" - - "SOIL" - - "NETHERRACK" - - "GLASS" - - "GLOWSTONE" - - "SNOW_BLOCK" - - "SLIME_BLOCK" - - "TNT" - - "REDSTONE_BLOCK" - - "NOTE_BLOCK" - - "PISTON_BASE" - - "PISTON_STICKY_BASE" - - "DISPENSER" - - "RAILS" - - "POWERED_RAIL" - - "ACTIVATOR_RAIL" - - "DETECTOR_RAIL" - - "TRIPWIRE_HOOK" - - "STRING" - ENCHANT-GUI: - TITLE: "&8Add enchantments" - ICONS: - BACK-TO: - NAME: "&7&lBack" - MATERIAL: ARROW - LORE: - - "&7Click to go back" - MAKE-UNBREAKABLE: - NAME: "&bMake unbreakable" - MATERIAL: BRICK - MAKE-BREAKABLE: - NAME: "&bMake breakable" - MATERIAL: BRICK - CLEAR-ENCHANTS: - NAME: "&bClear Enchants" - MATERIAL: BARRIER - CHANGE-DURABILITY: - NAME: "&bChange Durability" - MATERIAL: ANVIL - SET-ENCHANTMENT-LEVEL: - NAME: "&d%enchantment% &7- &e%level%" - MATERIAL: SUGAR - LORE: - - "&8&m------------------------" - - "&7Click here to set the level of" - - "&7the &d%enchantment% &7enchantment." - - "&8&m------------------------" - SET-ENCHANTMENT-LEVEL-PLACEHOLDER: - NAME: " " - MATERIAL: STAINED_GLASS_PANE - DAMAGE: 11 - ENCHANTMENT-ICON: - NAME: "&d%enchantment%" - MATERIAL: ENCHANTED_BOOK - LORE: - - "&8&m------------------------" - - "&7Click here to select" - - "&7the &d%enchantment% &7enchantment." - - "&8&m------------------------" - CUSTOM-DURABILITY-GUI: - TITLE: "1-%max%" - CHANGE-COUNT-GUI: - TITLE: "&8Change item count" - ICONS: - BACK-TO: - NAME: "&7&lBack" - MATERIAL: ARROW - LORE: - - "&7Click to go back" - CUSTOM-COUNT: - NAME: "&bCustom Amount" - MATERIAL: PAPER - CUSTOM-COUNT-GUI: - TITLE: "Enter a number 1-%max%" -DISABLED-ENCHANTS: - _CHESTPLATE: - - "THORNS" - - "BINDING_CURSE" - - "VANISHING_CURSE" - IRON_SWORD: - - "SHARPNESS" - -DEFAULT-SETTINGS: - NAME: "Kit %id%" - REGENERATION: true - HUNGER: true - BUILD: true - ROUNDS: 1 - HITDELAY: 20 - EP_COOLDOWN: 13 - GA_COOLDOWN: 5 - -MATCH-TYPES: # Options: DUEL, PARTY_FFA, PARTY_SPLIT, PARTY_VS_PARTY - - "DUEL" \ No newline at end of file diff --git a/core/src/main/resources/modern/config.yml b/core/src/main/resources/config.yml similarity index 98% rename from core/src/main/resources/modern/config.yml rename to core/src/main/resources/config.yml index 42840ddf4..69a1e9f8b 100644 --- a/core/src/main/resources/modern/config.yml +++ b/core/src/main/resources/config.yml @@ -1,4 +1,4 @@ -VERSION: 17 +VERSION: 19 # Mysql database setup. MYSQL-DATABASE: @@ -195,7 +195,7 @@ MATCH-SETTINGS: - "REGENERATION::20::2" REMOVE-EMPTY-BOTTLE: true # Removes empty potion bottles after the player use it. DUEL: - RIGHT-CLICK-TO-DUEL: true # When enabled, players can right-click another player in the lobby to send them a duel request. + SWORD-TO-DUEL: true # When enabled, hitting a player with the unranked sword in the lobby sends a duel request. INVITATION-EXPIRY: 60 # After the seconds, the duel request will expire. ROUND-SELECTOR: MAX: 10 @@ -488,6 +488,8 @@ EVENT: NAME: "Splegg" WINNER-COMMAND: - "practice ranked add %player% 3" + BREAKABLE-MATERIALS: # Generic entries like WOOL or TERRACOTTA also match colored variants. + - "WOOL" EGG-LAUNCHER-ITEM: NAME: "&aShoot The Blocks &7(Right-Click)" MATERIAL: IRON_SHOVEL diff --git a/core/src/main/resources/modern/divisions.yml b/core/src/main/resources/divisions.yml similarity index 100% rename from core/src/main/resources/modern/divisions.yml rename to core/src/main/resources/divisions.yml diff --git a/core/src/main/resources/modern/guis.yml b/core/src/main/resources/guis.yml similarity index 99% rename from core/src/main/resources/modern/guis.yml rename to core/src/main/resources/guis.yml index 47c7852dc..ee7f61495 100644 --- a/core/src/main/resources/modern/guis.yml +++ b/core/src/main/resources/guis.yml @@ -1,4 +1,4 @@ -VERSION: 12 +VERSION: 13 GENERAL-FILLER-ITEM: NAME: " " @@ -563,6 +563,26 @@ GUIS: - "&f&lClick here &fto duel this party." - "&7&m------------------------" FFA: + ARENA-SELECTOR: + TITLE: "&8Select an &6FFA Arena" + ROWS: 3 + ICONS: + ARENA: + BUILD-STATUS: + ENABLED: "&aEnabled" + DISABLED: "&cDisabled" + NAME: "&6%arena%" + LORE: + - "" + - "&eBuild: &f%build_status%" + - "&eRe-Kit After Kill: &f%rekit_after_kill%" + - "&eLobby After Death: &f%lobby_after_death%" + - "&eLadders: &f%ladders%" + - "&ePlayers: &f%players%" + - "" + - "&aClick to join this arena!" + FILLER: + MATERIAL: ORANGE_STAINED_GLASS_PANE LADDER-SELECTOR: TITLE: "&8Select a &6ladder &8to join" ICONS: diff --git a/core/src/main/resources/modern/inventories.yml b/core/src/main/resources/inventories.yml similarity index 100% rename from core/src/main/resources/modern/inventories.yml rename to core/src/main/resources/inventories.yml diff --git a/core/src/main/resources/modern/ladders/archer.yml b/core/src/main/resources/ladders/archer.yml similarity index 100% rename from core/src/main/resources/modern/ladders/archer.yml rename to core/src/main/resources/ladders/archer.yml diff --git a/core/src/main/resources/modern/ladders/axe.yml b/core/src/main/resources/ladders/axe.yml similarity index 100% rename from core/src/main/resources/modern/ladders/axe.yml rename to core/src/main/resources/ladders/axe.yml diff --git a/core/src/main/resources/modern/ladders/battlerush.yml b/core/src/main/resources/ladders/battlerush.yml similarity index 100% rename from core/src/main/resources/modern/ladders/battlerush.yml rename to core/src/main/resources/ladders/battlerush.yml diff --git a/core/src/main/resources/modern/ladders/bedwars.yml b/core/src/main/resources/ladders/bedwars.yml similarity index 100% rename from core/src/main/resources/modern/ladders/bedwars.yml rename to core/src/main/resources/ladders/bedwars.yml diff --git a/core/src/main/resources/modern/ladders/boxing.yml b/core/src/main/resources/ladders/boxing.yml similarity index 100% rename from core/src/main/resources/modern/ladders/boxing.yml rename to core/src/main/resources/ladders/boxing.yml diff --git a/core/src/main/resources/modern/ladders/bridges.yml b/core/src/main/resources/ladders/bridges.yml similarity index 100% rename from core/src/main/resources/modern/ladders/bridges.yml rename to core/src/main/resources/ladders/bridges.yml diff --git a/core/src/main/resources/modern/ladders/builduhc.yml b/core/src/main/resources/ladders/builduhc.yml similarity index 100% rename from core/src/main/resources/modern/ladders/builduhc.yml rename to core/src/main/resources/ladders/builduhc.yml diff --git a/core/src/main/resources/modern/ladders/crystal.yml b/core/src/main/resources/ladders/crystal.yml similarity index 100% rename from core/src/main/resources/modern/ladders/crystal.yml rename to core/src/main/resources/ladders/crystal.yml diff --git a/core/src/main/resources/modern/ladders/debuff.yml b/core/src/main/resources/ladders/debuff.yml similarity index 100% rename from core/src/main/resources/modern/ladders/debuff.yml rename to core/src/main/resources/ladders/debuff.yml diff --git a/core/src/main/resources/modern/ladders/fireball.yml b/core/src/main/resources/ladders/fireball.yml similarity index 100% rename from core/src/main/resources/modern/ladders/fireball.yml rename to core/src/main/resources/ladders/fireball.yml diff --git a/core/src/main/resources/modern/ladders/gapple.yml b/core/src/main/resources/ladders/gapple.yml similarity index 100% rename from core/src/main/resources/modern/ladders/gapple.yml rename to core/src/main/resources/ladders/gapple.yml diff --git a/core/src/main/resources/modern/ladders/mace.yml b/core/src/main/resources/ladders/mace.yml similarity index 100% rename from core/src/main/resources/modern/ladders/mace.yml rename to core/src/main/resources/ladders/mace.yml diff --git a/core/src/main/resources/modern/ladders/nodebuff.yml b/core/src/main/resources/ladders/nodebuff.yml similarity index 100% rename from core/src/main/resources/modern/ladders/nodebuff.yml rename to core/src/main/resources/ladders/nodebuff.yml diff --git a/core/src/main/resources/modern/ladders/pearlfight.yml b/core/src/main/resources/ladders/pearlfight.yml similarity index 100% rename from core/src/main/resources/modern/ladders/pearlfight.yml rename to core/src/main/resources/ladders/pearlfight.yml diff --git a/core/src/main/resources/modern/ladders/sg.yml b/core/src/main/resources/ladders/sg.yml similarity index 100% rename from core/src/main/resources/modern/ladders/sg.yml rename to core/src/main/resources/ladders/sg.yml diff --git a/core/src/main/resources/modern/ladders/skywars.yml b/core/src/main/resources/ladders/skywars.yml similarity index 100% rename from core/src/main/resources/modern/ladders/skywars.yml rename to core/src/main/resources/ladders/skywars.yml diff --git a/core/src/main/resources/modern/ladders/soup.yml b/core/src/main/resources/ladders/soup.yml similarity index 100% rename from core/src/main/resources/modern/ladders/soup.yml rename to core/src/main/resources/ladders/soup.yml diff --git a/core/src/main/resources/modern/ladders/spear.yml b/core/src/main/resources/ladders/spear.yml similarity index 100% rename from core/src/main/resources/modern/ladders/spear.yml rename to core/src/main/resources/ladders/spear.yml diff --git a/core/src/main/resources/modern/ladders/spleef.yml b/core/src/main/resources/ladders/spleef.yml similarity index 100% rename from core/src/main/resources/modern/ladders/spleef.yml rename to core/src/main/resources/ladders/spleef.yml diff --git a/core/src/main/resources/modern/ladders/sumo.yml b/core/src/main/resources/ladders/sumo.yml similarity index 100% rename from core/src/main/resources/modern/ladders/sumo.yml rename to core/src/main/resources/ladders/sumo.yml diff --git a/core/src/main/resources/modern/ladders/vanilla.yml b/core/src/main/resources/ladders/vanilla.yml similarity index 100% rename from core/src/main/resources/modern/ladders/vanilla.yml rename to core/src/main/resources/ladders/vanilla.yml diff --git a/core/src/main/resources/language.yml b/core/src/main/resources/language.yml index 723b04716..10112e3f8 100644 --- a/core/src/main/resources/language.yml +++ b/core/src/main/resources/language.yml @@ -1,4 +1,4 @@ -VERSION: 19 +VERSION: 20 CONSOLE-NAME: "Console" CANT-USE-CONSOLE: "You can't use this command from the console." @@ -1594,12 +1594,16 @@ FFA: CANT-JOIN-FFA: "You can't spectate the FFA right now." LEAVE: NOT-IN-FFA: "You are not in a FFA." + KIT: + NOT-IN-FFA: "You are not in a FFA." + ALREADY-IN-KIT: "You are already in this kit." HELP: - "----------------------------------------" - "FFA Commands" - "" - - " » /%label% join - Join the FFA." - - " » /%label% leave - Leave the FFA." + - " » /%label% join - Join a FFA." + - " » /%label% leave - Leave a FFA." + - " » /%label% kit - Open FFA kit selector." - " » /%label% spectate - Spectate FFA." - " » /%label% list - List all available arenas." - "----------------------------------------" diff --git a/core/src/main/resources/modern/playerkit.yml b/core/src/main/resources/playerkit.yml similarity index 100% rename from core/src/main/resources/modern/playerkit.yml rename to core/src/main/resources/playerkit.yml diff --git a/distribution/pom.xml b/distribution/pom.xml index 557c0d91b..9898f8782 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -10,15 +10,14 @@ dev.nandi0813 practice-parent - 6.4.6-SNAPSHOT + 7.0.0-SNAPSHOT 8 UTF-8 - - ./target - ./target + + ${maven.multiModuleProjectDirectory} @@ -28,25 +27,11 @@ ${project.parent.version} compile - - - dev.nandi0813 - practice-spigot_modern - ${project.parent.version} - compile - - - - dev.nandi0813 - practice-spigot_1_8_8 - ${project.parent.version} - compile - clean install - ZonePractice Pro v6.4.6-SNAPSHOT + ZonePractice Pro v7.0.0-SNAPSHOT @@ -131,11 +116,11 @@ diff --git a/libs/PaperSpigot-1.8.8-R0.1-SNAPSHOT.jar b/libs/PaperSpigot-1.8.8-R0.1-SNAPSHOT.jar deleted file mode 100644 index 9d9b594e4..000000000 --- a/libs/PaperSpigot-1.8.8-R0.1-SNAPSHOT.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0610cd4a7ade17cf2d26059d3e2c93f6963435b8e0e314ba5784b411e0590338 -size 19891199 diff --git a/pom.xml b/pom.xml index e08fd06d2..3290be654 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.nandi0813 practice-parent - 6.4.6-SNAPSHOT + 7.0.0-SNAPSHOT pom ZonePractice Pro @@ -18,8 +18,6 @@ core - spigot_1_8_8 - spigot_modern distribution diff --git a/spigot_1_8_8/pom.xml b/spigot_1_8_8/pom.xml deleted file mode 100644 index 97a978d74..000000000 --- a/spigot_1_8_8/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - - - dev.nandi0813 - practice-parent - 6.4.6-SNAPSHOT - - - practice-spigot_1_8_8 - - - - - org.github.paperspigot - paperspigot-api - 1.8.8-R0.1-SNAPSHOT - provided - - - - dev.nandi0813 - practice-core - ${project.parent.version} - provided - - - - \ No newline at end of file diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/Classes.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/Classes.java deleted file mode 100644 index 7201f388e..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/Classes.java +++ /dev/null @@ -1,51 +0,0 @@ -package dev.nandi0813.practice_1_8_8; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.module.interfaces.*; -import dev.nandi0813.practice_1_8_8.interfaces.LadderUtil; -import dev.nandi0813.practice_1_8_8.interfaces.BuildListener; -import dev.nandi0813.practice_1_8_8.interfaces.LegacyItemCooldownHandler; -import dev.nandi0813.practice_1_8_8.interfaces.PlayerHiderUtil; -import dev.nandi0813.practice_1_8_8.listener.ArenaListener; -import dev.nandi0813.practice_1_8_8.listener.FFAListener; -import dev.nandi0813.practice_1_8_8.listener.MatchListener; -import dev.nandi0813.practice_1_8_8.listener.PlayerChatListener; -import lombok.Getter; -import org.bukkit.Bukkit; - -@Getter -public class Classes implements dev.nandi0813.practice.module.util.Classes { - - public WorldCreate worldCreate = new dev.nandi0813.practice_1_8_8.interfaces.WorldCreate(); - public PlayerHiderInterface playerHiderUtil = new PlayerHiderUtil(); - public ItemMaterialUtil itemMaterialUtil = new dev.nandi0813.practice_1_8_8.interfaces.ItemMaterialUtil(); - public LadderUtil ladderUtil = new LadderUtil(); - public ItemCreateUtil itemCreateUtil = new dev.nandi0813.practice_1_8_8.interfaces.ItemCreateUtil(); - public PlayerUtil playerUtil = new dev.nandi0813.practice_1_8_8.interfaces.PlayerUtil(); - public ArenaUtil arenaUtil = new dev.nandi0813.practice_1_8_8.interfaces.ArenaUtil(); - public ArenaCopyUtil arenaCopyUtil = new dev.nandi0813.practice_1_8_8.interfaces.ArenaCopyUtil(); - - public BedUtil bedUtil = new dev.nandi0813.practice_1_8_8.interfaces.BedUtil(); - public EntityHider entityHider = new dev.nandi0813.practice_1_8_8.interfaces.EntityHider(ZonePractice.getInstance(), EntityHider.Policy.BLACKLIST); - public StatisticListener statisticListener = new dev.nandi0813.practice_1_8_8.interfaces.StatisticListener(); - public ConfigItemProvider configItemProvider = new dev.nandi0813.practice_1_8_8.interfaces.LegacyConfigItemProvider(); - public AbstractBuildListener buildListener = new BuildListener(); - - public Class changedBlockClass = dev.nandi0813.practice_1_8_8.interfaces.ChangedBlock.class; - public Class kitDataClass = dev.nandi0813.practice_1_8_8.interfaces.KitData.class; - public Class actionBarClass = dev.nandi0813.practice_1_8_8.interfaces.ActionBar.class; - - public ItemCooldownHandler itemCooldownHandler = new LegacyItemCooldownHandler(); - - public Classes() { - Bukkit.getServer().getPluginManager().registerEvents(arenaCopyUtil, ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(statisticListener, ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new MatchListener(), ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new FFAListener(), ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new ArenaListener(), ZonePractice.getInstance()); - - Bukkit.getServer().getPluginManager().registerEvents(new EPCountdownListener(), ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new PlayerChatListener(), ZonePractice.getInstance()); - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/EPCountdownListener.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/EPCountdownListener.java deleted file mode 100644 index 738dab828..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/EPCountdownListener.java +++ /dev/null @@ -1,66 +0,0 @@ -package dev.nandi0813.practice_1_8_8; - -import dev.nandi0813.practice.manager.fight.ffa.FFAManager; -import dev.nandi0813.practice.manager.fight.ffa.game.FFA; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.fight.match.MatchManager; -import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.util.PermanentConfig; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEvent; - -public class EPCountdownListener implements Listener { - - @EventHandler - public void onEnderPearlShoot(PlayerInteractEvent e) { - Player player = e.getPlayer(); - - if (ClassImport.getClasses().getPlayerUtil().isItemInUse(player, Material.ENDER_PEARL)) { - FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); - if (ffa != null) { - int duration = ffa.getPlayers().get(player).getEnderPearlCooldown(); - if (duration <= 0) { - return; - } - - ClassImport.getClasses().getItemCooldownHandler().handleEnderPearlFFA( - player, - ffa.getFightPlayers().get(player), - duration, - PermanentConfig.FFA_EXP_BAR, - e, - "FFA.GAME.COOLDOWN.ENDER-PEARL" - ); - return; - } - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match != null) { - int duration = match.getLadder().getEnderPearlCooldown(); - if (duration <= 0) { - return; - } - - if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) { - e.setCancelled(true); - player.updateInventory(); - return; - } - - ClassImport.getClasses().getItemCooldownHandler().handleEnderPearlMatch( - player, - match.getMatchPlayers().get(player), - duration, - PermanentConfig.MATCH_EXP_BAR, - e, - "MATCH.COOLDOWN.ENDER-PEARL" - ); - } - } - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/EnderPearlRunnable.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/EnderPearlRunnable.java deleted file mode 100644 index 577b1f01e..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/EnderPearlRunnable.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.nandi0813.practice_1_8_8.cooldown; - -import dev.nandi0813.practice.manager.fight.util.FightPlayer; -import dev.nandi0813.practice.manager.fight.util.Runnable.GameRunnable; -import dev.nandi0813.practice.util.cooldown.CooldownObject; -import org.bukkit.entity.Player; - -public class EnderPearlRunnable extends GameRunnable { - - public EnderPearlRunnable(Player player, FightPlayer fightPlayer, int seconds, boolean expBar) { - super(player, fightPlayer, seconds, CooldownObject.ENDER_PEARL, expBar); - } - - @Override - public void abstractCancel() { - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/FireballRunnable.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/FireballRunnable.java deleted file mode 100644 index 3e8ebf19d..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/FireballRunnable.java +++ /dev/null @@ -1,68 +0,0 @@ -package dev.nandi0813.practice_1_8_8.cooldown; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.event.EventManager; -import dev.nandi0813.practice.manager.fight.event.enums.EventStatus; -import dev.nandi0813.practice.manager.fight.event.interfaces.Event; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.fight.match.MatchManager; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.util.cooldown.CooldownObject; -import dev.nandi0813.practice.util.cooldown.PlayerCooldown; -import lombok.Getter; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -@Getter -public class FireballRunnable extends BukkitRunnable { - - private final Player player; - private final Profile profile; - private boolean running; - private final double seconds; - - public FireballRunnable(Player player, double seconds) { - this.player = player; - this.seconds = seconds; - profile = ProfileManager.getInstance().getProfile(player); - } - - public void begin() { - running = true; - PlayerCooldown.addCooldown(player, CooldownObject.FIREBALL_FIGHT_FIREBALL, seconds); - this.runTaskTimerAsynchronously(ZonePractice.getInstance(), 0, 10L); - } - - @Override - public void cancel() { - if (running) { - Bukkit.getScheduler().cancelTask(this.getTaskId()); - running = false; - PlayerCooldown.removeCooldown(player, CooldownObject.FIREBALL_FIGHT_FIREBALL); - } - } - - @Override - public void run() { - if (PlayerCooldown.isActive(player, CooldownObject.FIREBALL_FIGHT_FIREBALL)) { - if (profile.getStatus().equals(ProfileStatus.MATCH)) { - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - Statistic roundStatistic = match.getCurrentStat(player); - - if (roundStatistic.isSet()) - cancel(); - } else if (profile.getStatus().equals(ProfileStatus.EVENT)) { - Event event = EventManager.getInstance().getEventByPlayer(player); - - if (event.getStatus().equals(EventStatus.END)) - cancel(); - } else - cancel(); - } else - cancel(); - } -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/FireworkRocketRunnable.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/FireworkRocketRunnable.java deleted file mode 100644 index 964179c76..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/FireworkRocketRunnable.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.nandi0813.practice_1_8_8.cooldown; - -import dev.nandi0813.practice.manager.fight.util.FightPlayer; -import dev.nandi0813.practice.manager.fight.util.Runnable.GameRunnable; -import dev.nandi0813.practice.util.cooldown.CooldownObject; -import org.bukkit.entity.Player; - -public class FireworkRocketRunnable extends GameRunnable { - - public FireworkRocketRunnable(Player player, FightPlayer fightPlayer, int seconds, boolean expBar) { - super(player, fightPlayer, seconds, CooldownObject.FIREWORK_ROCKET, expBar); - } - - @Override - public void abstractCancel() { - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/GoldenAppleRunnable.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/GoldenAppleRunnable.java deleted file mode 100644 index 50fd2ea98..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/cooldown/GoldenAppleRunnable.java +++ /dev/null @@ -1,58 +0,0 @@ -package dev.nandi0813.practice_1_8_8.cooldown; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.match.MatchManager; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.util.cooldown.CooldownObject; -import dev.nandi0813.practice.util.cooldown.PlayerCooldown; -import lombok.Getter; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -@Getter -public class GoldenAppleRunnable extends BukkitRunnable { - - private final Player player; - private final Profile profile; - private boolean running; - private final int seconds; - - public GoldenAppleRunnable(Player player, int seconds) { - this.player = player; - this.seconds = seconds; - profile = ProfileManager.getInstance().getProfile(player); - } - - public void begin() { - running = true; - PlayerCooldown.addCooldown(player, CooldownObject.GOLDEN_APPLE, seconds); - this.runTaskTimerAsynchronously(ZonePractice.getInstance(), 0, 10L); - } - - @Override - public void cancel() { - if (running) { - Bukkit.getScheduler().cancelTask(this.getTaskId()); - running = false; - PlayerCooldown.removeCooldown(player, CooldownObject.GOLDEN_APPLE); - } - } - - @Override - public void run() { - if (PlayerCooldown.isActive(player, CooldownObject.GOLDEN_APPLE)) { - if (profile.getStatus().equals(ProfileStatus.MATCH) || profile.getStatus().equals(ProfileStatus.FFA)) { - Statistic roundStatistic = MatchManager.getInstance().getLiveMatchByPlayer(player).getCurrentStat(player); - - if (roundStatistic.isSet()) - cancel(); - } else - cancel(); - } else - cancel(); - } -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ActionBar.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ActionBar.java deleted file mode 100644 index efa1b1b8a..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ActionBar.java +++ /dev/null @@ -1,40 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.util.StringUtil; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import net.minecraft.server.v1_8_R3.ChatComponentText; -import net.minecraft.server.v1_8_R3.PacketPlayOutChat; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; -import org.bukkit.entity.Player; - -public class ActionBar extends dev.nandi0813.practice.module.interfaces.actionbar.ActionBar { - - public ActionBar(Profile profile) { - super(profile); - } - - @Override - public void send() { - Player player = profile.getPlayer().getPlayer(); - - if (player != null) { - sendActionText(player, StringUtil.CC(LegacyComponentSerializer.legacyAmpersand().serialize(this.message))); - } - } - - @Override - public void clear() { - Player player = profile.getPlayer().getPlayer(); - - if (player != null) { - sendActionText(player, ""); - } - } - - public void sendActionText(Player player, String message) { - PacketPlayOutChat packet = new PacketPlayOutChat(new ChatComponentText(message), (byte) 2); - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ArenaCopyUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ArenaCopyUtil.java deleted file mode 100644 index 0e7d5c775..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ArenaCopyUtil.java +++ /dev/null @@ -1,41 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.manager.arena.arenas.ArenaCopy; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.util.Cuboid; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; - -public class ArenaCopyUtil extends dev.nandi0813.practice.module.interfaces.ArenaCopyUtil { - - @Override - protected void copyBlock(Block oldBlock, Block newBlock) { - try { - // OPTIMIZATION: Disable physics during copy for massive speedup - newBlock.setType(oldBlock.getType(), false); - - BlockState oldState = oldBlock.getState(); - BlockState newState = newBlock.getState(); - - newState.setData(oldState.getData().clone()); - newState.update(true, false); // force=true, applyPhysics=false - - newBlock.setBiome(oldBlock.getBiome()); - } catch (Exception e) { - // Skip problematic blocks (e.g., MaterialData type incompatibilities like Torch) - // This allows the copy process to continue without halting - } - } - - @Override - protected void copyArena(Profile profile, ArenaCopy arenaCopy, Cuboid copyFrom, Location reference, Location newLocation) { - copyNormal(profile, arenaCopy, copyFrom, reference, newLocation); - } - - @Override - public void deleteArena(final String arena, final Cuboid cuboid) { - deleteNormal(arena, cuboid); - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ArenaUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ArenaUtil.java deleted file mode 100644 index 395f77da7..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ArenaUtil.java +++ /dev/null @@ -1,123 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.manager.arena.arenas.interfaces.BasicArena; -import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; -import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; -import dev.nandi0813.practice.util.BasicItem; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.ArmorStand; -import org.bukkit.inventory.ItemStack; - -public class ArenaUtil implements dev.nandi0813.practice.module.interfaces.ArenaUtil { - - @Override - public boolean turnsToDirt(Block block) { - Material type = block.getType(); - return - type.equals(Material.GRASS) || - type.equals(Material.MYCEL) || - type.equals(Material.DIRT) && - block.getData() == 2; - } - - @Override - public boolean containsDestroyableBlock(Ladder ladder, Block block) { - if (!(ladder instanceof NormalLadder)) return false; - NormalLadder normalLadder = (NormalLadder) ladder; - - if (!ladder.isBuild()) return false; - if (normalLadder.getDestroyableBlocks().isEmpty()) return false; - if (block == null) return false; - - for (BasicItem basicItem : normalLadder.getDestroyableBlocks()) { - ItemStack itemStack = block.getState().getData().toItemStack(); - if (basicItem.getMaterial().equals(itemStack.getType()) && basicItem.getDamage() == itemStack.getDurability()) - return true; - } - return false; - } - - @Override - public boolean requiresSupport(Block block) { - switch (block.getType()) { - case LONG_GRASS: // tall grass / fern - case DEAD_BUSH: - case YELLOW_FLOWER: // dandelion - case RED_ROSE: // all small flowers share this Material in 1.8.8 - case SAPLING: - case TORCH: - case REDSTONE_TORCH_ON: - case REDSTONE_TORCH_OFF: - case REDSTONE_WIRE: - case LEVER: - case STONE_BUTTON: - case WOOD_BUTTON: - case DIODE_BLOCK_ON: - case DIODE_BLOCK_OFF: - case REDSTONE_COMPARATOR_ON: - case REDSTONE_COMPARATOR_OFF: - case TRIPWIRE_HOOK: - case TRIPWIRE: - case SNOW: - case SUGAR_CANE_BLOCK: - case CROPS: // wheat - case CARROT: - case POTATO: - case NETHER_WARTS: - case PUMPKIN_STEM: - case MELON_STEM: - case CACTUS: - case VINE: // vines attach to the side of a block - case WATER_LILY: - case DOUBLE_PLANT: // sunflower, lilac, rose bush, peony, tall grass (double) - return true; - default: - return false; - } - } - - @Override - public void loadArenaChunks(BasicArena arena) { - if (arena.getCuboid() == null) return; - // 1.8.8 has no async chunk-load API — stagger each chunk one tick apart so - // the server never freezes trying to load all chunks in a single tick. - org.bukkit.plugin.Plugin plugin = dev.nandi0813.practice.ZonePractice.getInstance(); - org.bukkit.World world = arena.getCuboid().getWorld(); - if (world == null) return; - - int minCX = arena.getCuboid().getLowerX() >> 4; - int maxCX = arena.getCuboid().getUpperX() >> 4; - int minCZ = arena.getCuboid().getLowerZ() >> 4; - int maxCZ = arena.getCuboid().getUpperZ() >> 4; - - long delay = 0; - for (int cx = minCX; cx <= maxCX; cx++) { - for (int cz = minCZ; cz <= maxCZ; cz++) { - final int x = cx; - final int z = cz; - org.bukkit.Bukkit.getScheduler().runTaskLater(plugin, () -> { - if (!world.isChunkLoaded(x, z)) { - world.loadChunk(x, z); - } - }, delay++); - } - } - } - - @Override - public void setArmorStandItemInHand(ArmorStand armorStand, ItemStack item, boolean rightHand) { - if (armorStand == null) return; - - // In 1.8.8, there's only one hand (right hand) - armorStand.setItemInHand(item); - } - - @Override - public void setArmorStandInvulnerable(ArmorStand armorStand) { - // 1.8.8 doesn't have setInvulnerable or setPersistent methods - // We'll handle invulnerability through event cancellation instead - // Armor stands in 1.8.8 are already non-persistent by default - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/BedUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/BedUtil.java deleted file mode 100644 index a6a814d21..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/BedUtil.java +++ /dev/null @@ -1,111 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.manager.arena.util.BedLocation; -import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.fight.match.enums.TeamEnum; -import dev.nandi0813.practice.manager.fight.match.interfaces.Team; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.util.Common; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.material.Bed; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; - -public class BedUtil extends dev.nandi0813.practice.module.interfaces.BedUtil { - - @Override - public BedLocation getBedLocation(Block block) { - if (block == null) return null; - - Location bedLoc = block.getLocation(); - Bed bed = (Bed) block.getState().getData(); - - if (bed.isHeadOfBed()) - bedLoc = block.getRelative(bed.getFacing().getOppositeFace()).getLocation(); - - return new BedLocation(bedLoc.getWorld(), bedLoc.getX(), bedLoc.getY(), bedLoc.getZ(), bed.getFacing()); - } - - @Override - public void placeBed(Location loc, BlockFace face) { - Block bedFootBlock = loc.getBlock(); - Block bedHeadBlock = bedFootBlock.getRelative(face); - - BlockState bedFootState = bedFootBlock.getState(); - bedFootState.setType(Material.BED_BLOCK); - Bed bedFootData = new Bed(Material.BED_BLOCK); - bedFootData.setHeadOfBed(false); - bedFootData.setFacingDirection(face); - bedFootState.setData(bedFootData); - bedFootState.update(true); - - BlockState bedHeadState = bedHeadBlock.getState(); - bedHeadState.setType(Material.BED_BLOCK); - Bed bedHeadData = new Bed(Material.BED_BLOCK); - bedHeadData.setHeadOfBed(true); - bedHeadData.setFacingDirection(face); - bedHeadState.setData(bedHeadData); - bedHeadState.update(true); - } - - @Override - public boolean onBedBreak(final @NotNull BlockBreakEvent e, final @NotNull Match match) { - Player player = e.getPlayer(); - - if (match.getCurrentStat(player).isSet()) return false; - - final Map bedStatus = match.getCurrentRound().getBedStatus(); - if (!bedStatus.get(TeamEnum.TEAM1) && !bedStatus.get(TeamEnum.TEAM2)) return false; - - Block bedBlock = e.getBlock(); - if (bedBlock == null || !bedBlock.getType().equals(Material.BED_BLOCK)) return false; - - TeamEnum team = ((Team) match).getTeam(player); - Location bedLoc = bedBlock.getLocation(); - Bed bed = (Bed) e.getBlock().getState().getData(); - - boolean destroy = false; - if (match.getArena().getBedLoc1().getLocation().equals(bedLoc) - || match.getArena().getBedLoc1().getLocation().getBlock().getRelative(match.getArena().getBedLoc1().getFacing()).getLocation().equals(bedLoc)) { - e.setCancelled(true); - - if (team.equals(TeamEnum.TEAM2)) { - destroy = true; - - bedStatus.replace(TeamEnum.TEAM1, false); - sendBedDestroyMessage(match, TeamEnum.TEAM1); - } else - Common.sendMMMessage(player, LanguageManager.getString("MATCH.CANT-BREAK-OWN-BED")); - } else if (match.getArena().getBedLoc2().getLocation().equals(bedLoc) - || match.getArena().getBedLoc2().getLocation().getBlock().getRelative(match.getArena().getBedLoc2().getFacing()).getLocation().equals(bedLoc)) { - e.setCancelled(true); - - if (team.equals(TeamEnum.TEAM1)) { - destroy = true; - - bedStatus.replace(TeamEnum.TEAM2, false); - sendBedDestroyMessage(match, TeamEnum.TEAM2); - } else - Common.sendMMMessage(player, LanguageManager.getString("MATCH.CANT-BREAK-OWN-BED")); - } - - if (destroy) { - match.addBlockChange(ClassImport.createChangeBlock(e.getBlock())); - if (bed.isHeadOfBed()) - bedLoc.getBlock().getRelative(bed.getFacing().getOppositeFace()).setType(Material.AIR); - else - bedBlock.setType(Material.AIR); - } - - return destroy; - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/BuildListener.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/BuildListener.java deleted file mode 100644 index 1908e50db..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/BuildListener.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.module.interfaces.AbstractBuildListener; - -/** - * 1.8.8 implementation of the build-block listener. - * All functionality is inherited from {@link AbstractBuildListener}: - * explosions, TNT tracking via EntitySpawnEvent, pistons, block form, - * liquid flow and block spread all work out of the box. - * No additional API calls exist on 1.8.8 that need to be handled here. - */ -public class BuildListener extends AbstractBuildListener { - // isTntBlockAlreadyTracked() returns false by default → EntitySpawnEvent - // captures the TNT block with the Material.TNT override as needed for 1.8.8. -} \ No newline at end of file diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ChangedBlock.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ChangedBlock.java deleted file mode 100644 index 2755e7219..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ChangedBlock.java +++ /dev/null @@ -1,92 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.util.Common; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.Chest; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.material.Bed; -import org.bukkit.material.MaterialData; - -public class ChangedBlock extends dev.nandi0813.practice.module.interfaces.ChangedBlock { - - private final MaterialData materialData; - - public ChangedBlock(final Block oldBlock) { - super(oldBlock); - this.materialData = oldBlock.getState().getData(); - } - - public ChangedBlock(final Block oldBlock, final Material originalMaterial) { - super(oldBlock, originalMaterial); - // Block is already AIR/changed; use the default MaterialData for the original material - this.materialData = new org.bukkit.material.MaterialData(originalMaterial); - } - - public ChangedBlock(final BlockPlaceEvent e) { - super(e); - this.materialData = e.getBlockReplacedState().getData(); - } - - protected void saveChest(Location loc) { - try { - Block block = loc.getBlock(); - - if (block.getType() == Material.CHEST || block.getType() == Material.TRAPPED_CHEST) { - Chest chest = (Chest) block.getState(); - chestInventory = chest.getInventory().getContents().clone(); - } - } catch (Exception e) { - Common.sendConsoleMMMessage(LanguageManager.getString("ARENA.ARENA-REGEN-FAILED-CHEST")); - } - } - - protected void saveBed(Location loc) { - Block block = loc.getBlock(); - - if (block != null && block.getType() == Material.BED_BLOCK) { - Bed bed = (Bed) block.getState().getData(); - if (bed.isHeadOfBed()) { - this.location = block.getRelative(bed.getFacing().getOppositeFace(), 1).getLocation(); - } - - this.bedFace = bed.getFacing(); - } - } - - public void reset() { - if (location == null) return; - - if (bedFace != null) { - ClassImport.getClasses().getBedUtil().placeBed(location, bedFace); - return; - } - - try { - // Capture a single BlockState snapshot and apply all mutations to it before - // committing — calling block.getState() multiple times returns independent - // snapshots, so setData() on one has no effect on another's update() call. - block.setType(material); - org.bukkit.block.BlockState state = block.getState(); - state.setType(material); - state.setData(materialData); - state.update(true, false); - - if (chestInventory != null && block.getState() instanceof Chest) { - Chest chest = (Chest) block.getState(); - chest.getInventory().setContents(chestInventory); - } - } catch (IllegalArgumentException e) { - // Handle MaterialData type incompatibilities (e.g., Tree, Torch) - // Fall back to setting the material only, without custom MaterialData - block.setType(material); - org.bukkit.block.BlockState state = block.getState(); - state.setType(material); - state.update(true, false); - } - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/EntityHider.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/EntityHider.java deleted file mode 100644 index e50c3d669..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/EntityHider.java +++ /dev/null @@ -1,51 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.util.Vector3d; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDestroyEntities; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; -import io.github.retrooper.packetevents.util.SpigotConversionUtil; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; - -public class EntityHider extends dev.nandi0813.practice.module.interfaces.EntityHider implements Listener { - - public EntityHider(Plugin plugin, Policy policy) { - super(plugin, policy); - } - - @Override - public void showEntity(Player observer, Entity entity) { - validate(observer, entity); - boolean hiddenBefore = !setVisibility(observer, entity.getEntityId(), true); - - // Resend packets - if (hiddenBefore) { - WrapperPlayServerSpawnEntity spawnEntity = new WrapperPlayServerSpawnEntity( - entity.getEntityId(), - entity.getUniqueId(), - SpigotConversionUtil.fromBukkitEntityType(entity.getType()), - SpigotConversionUtil.fromBukkitLocation(entity.getLocation()), - entity.getLocation().getYaw(), - 0, - new Vector3d(entity.getVelocity().getX(), entity.getVelocity().getY(), entity.getVelocity().getZ()) - ); - - PacketEvents.getAPI().getPlayerManager().sendPacket(observer, spawnEntity); - } - } - - @Override - public void hideEntity(Player observer, Entity entity) { - validate(observer, entity); - boolean visibleBefore = setVisibility(observer, entity.getEntityId(), false); - - if (visibleBefore) { - WrapperPlayServerDestroyEntities destroyEntities = new WrapperPlayServerDestroyEntities(new int[]{entity.getEntityId()}); - PacketEvents.getAPI().getPlayerManager().sendPacket(observer, destroyEntities); - } - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ItemCreateUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ItemCreateUtil.java deleted file mode 100644 index ea2844c31..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ItemCreateUtil.java +++ /dev/null @@ -1,103 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.util.StringUtil; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.List; - -public class ItemCreateUtil extends dev.nandi0813.practice.module.interfaces.ItemCreateUtil { - - @Override - public ItemStack createItem(String displayname, Material material, Short damage, int amount, List lore) { - ItemStack itemstack = new ItemStack(material, amount, damage); - ItemMeta itemmeta = itemstack.getItemMeta(); - itemmeta.setDisplayName(StringUtil.CC(displayname)); - itemmeta.setLore(StringUtil.CC(lore)); - hideItemFlags(itemmeta); - itemstack.setItemMeta(itemmeta); - return itemstack; - } - - @Override - public ItemStack createItem(String displayname, Material material) { - ItemStack itemstack = new ItemStack(material); - ItemMeta itemmeta = itemstack.getItemMeta(); - itemmeta.setDisplayName(StringUtil.CC(displayname)); - hideItemFlags(itemmeta); - itemstack.setItemMeta(itemmeta); - return itemstack; - } - - @Override - public ItemStack createItem(Material material, Short damage) { - ItemStack itemstack = new ItemStack(material, 1, damage); - ItemMeta itemmeta = itemstack.getItemMeta(); - hideItemFlags(itemmeta); - itemstack.setItemMeta(itemmeta); - return itemstack; - } - - @Override - public ItemStack createItem(String displayname, Material material, Short damage) { - ItemStack itemstack = new ItemStack(material, 1, damage); - ItemMeta itemmeta = itemstack.getItemMeta(); - itemmeta.setDisplayName(StringUtil.CC(displayname)); - itemstack.setItemMeta(itemmeta); - return itemstack; - } - - @Override - public ItemStack createItem(String displayname, Material material, List lore) { - ItemStack itemstack = new ItemStack(material); - ItemMeta itemmeta = itemstack.getItemMeta(); - itemmeta.setDisplayName(StringUtil.CC(displayname)); - itemmeta.setLore(StringUtil.CC(lore)); - hideItemFlags(itemmeta); - itemstack.setItemMeta(itemmeta); - return itemstack; - } - - @Override - public ItemStack createItem(String displayname, Material material, Short damage, List lore) { - ItemStack itemstack = new ItemStack(material, 1, damage); - ItemMeta itemmeta = itemstack.getItemMeta(); - itemmeta.setDisplayName(StringUtil.CC(displayname)); - itemmeta.setLore(StringUtil.CC(lore)); - hideItemFlags(itemmeta); - itemstack.setItemMeta(itemmeta); - return itemstack; - } - - @Override - public ItemStack createItem(ItemStack item, List lore) { - ItemStack itemstack = new ItemStack(item.getType()); - itemstack.setDurability(item.getDurability()); - if (item.hasItemMeta()) { - ItemMeta itemmeta = itemstack.getItemMeta(); - itemmeta.setDisplayName(StringUtil.CC(item.getItemMeta().getDisplayName())); - itemmeta.setLore(StringUtil.CC(lore)); - hideItemFlags(itemmeta); - itemstack.setItemMeta(itemmeta); - } - return itemstack; - } - - @Override - public ItemStack createItem(ItemStack item, String name, List lore) { - ItemStack itemStack = new ItemStack(item.getType()); - itemStack.setDurability(item.getDurability()); - - ItemMeta itemMeta = itemStack.getItemMeta(); - - itemMeta.setDisplayName(name); - itemMeta.setLore(lore); - hideItemFlags(itemMeta); - - itemStack.setItemMeta(itemMeta); - - return itemStack; - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ItemMaterialUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ItemMaterialUtil.java deleted file mode 100644 index b47552f36..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/ItemMaterialUtil.java +++ /dev/null @@ -1,124 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.inventory.meta.SkullMeta; - -public class ItemMaterialUtil implements dev.nandi0813.practice.module.interfaces.ItemMaterialUtil { - - @Override - public Material getSnowball() { - return Material.SNOW_BALL; - } - - @Override - public Material getIronShovel() { - return Material.IRON_SPADE; - } - - @Override - public Material getEyeOfEnder() { - return Material.EYE_OF_ENDER; - } - - @Override - public Material getRedBed() { - return Material.BED; - } - - @Override - public Material getMushroomSoup() { - return Material.MUSHROOM_SOUP; - } - - @Override - public Material getWater() { - return Material.STATIONARY_WATER; - } - - @Override - public Material getLava() { - return Material.STATIONARY_LAVA; - } - - @Override - public Material getFireball() { - return Material.FIREBALL; - } - - @Override - public Material getEndPortal() { - return Material.ENDER_PORTAL; - } - - @Override - public Material getLilyPad() { - return Material.WATER_LILY; - } - - @Override - public Material getStainedClay() { - return Material.STAINED_CLAY; - } - - @Override - public Material getSplashPotion() { - return Material.POTION; - } - - @Override - public Material getGoldSword() { - return Material.GOLD_SWORD; - } - - @Override - public Material getClock() { - return Material.WATCH; - } - - @Override - public EntityType getTNTMineCart() { - return EntityType.MINECART_TNT; - } - - @Override - public ItemStack getPlayerHead(OfflinePlayer player) { - ItemStack item = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta skull = (SkullMeta) item.getItemMeta(); - skull.setOwner(player.getName()); - item.setItemMeta(skull); - return item; - } - - @Override - public ItemStack getSword() { - return new ItemStack(Material.DIAMOND_SWORD); - } - - @Override - public ItemStack getRedBlock() { - // In 1.8.8, use red wool (damage value 14) - return new ItemStack(Material.WOOL, 1, (short) 14); - } - - @Override - public ItemStack getDefaultPlayerHead() { - // In 1.8.8, use Steve head (skull with damage 3, no owner) - return new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - } - - @Override - public ItemStack getRedBoots() { - ItemStack boots = new ItemStack(Material.LEATHER_BOOTS); - LeatherArmorMeta meta = (LeatherArmorMeta) boots.getItemMeta(); - if (meta != null) { - meta.setColor(Color.RED); - boots.setItemMeta(meta); - } - return boots; - } -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/KitData.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/KitData.java deleted file mode 100644 index d432f5124..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/KitData.java +++ /dev/null @@ -1,43 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import org.bukkit.entity.Player; - -public class KitData extends dev.nandi0813.practice.module.interfaces.KitData { - - public KitData() { - super(); - } - - public KitData(dev.nandi0813.practice.module.interfaces.KitData kitData) { - super(kitData); - } - - @Override - public void setStorage(Player player) { - this.storage = player.getInventory().getContents().clone(); - } - - @Override - public void setArmor(Player player) { - this.armor = player.getInventory().getArmorContents().clone(); - } - - @Override - public void setExtra(Player player) { - this.extra = null; - } - - @Override - public void loadStorage(Player player) { - player.getInventory().setContents(this.storage.clone()); - } - - @Override - public void loadArmor(Player player) { - player.getInventory().setArmorContents(this.armor.clone()); - } - - @Override - public void loadExtra(Player player) { /* Unsued */ } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LadderUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LadderUtil.java deleted file mode 100644 index 5c43be8a3..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LadderUtil.java +++ /dev/null @@ -1,125 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.ladder.type.FireballFight; -import dev.nandi0813.practice.module.interfaces.ItemCreateUtil; -import dev.nandi0813.practice.util.Common; -import dev.nandi0813.practice.util.StringUtil; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.material.MaterialData; -import org.bukkit.metadata.FixedMetadataValue; - -import java.util.Objects; - -import static dev.nandi0813.practice.util.PermanentConfig.FIGHT_ENTITY; - -public class LadderUtil implements dev.nandi0813.practice.module.interfaces.LadderUtil { - - @Override - public void loadInventory(Player player, ItemStack[] armor, ItemStack[] inventory, ItemStack[] extra) { - player.getInventory().setArmorContents(armor); - player.getInventory().setContents(inventory); - } - - public ItemStack changeItemColor(ItemStack item, Component teamColor) { - Material itemType = item.getType(); - String color = LegacyComponentSerializer.legacyAmpersand().serialize(teamColor.append(Component.text("-"))); - color = color.replace("-", ""); - - if (itemType.equals(Material.WOOL) || - itemType.equals(Material.STAINED_CLAY) || - itemType.equals(Material.STAINED_GLASS) || - itemType.equals(Material.STAINED_GLASS_PANE) || - itemType.equals(Material.CARPET)) { - item.setDurability(ItemCreateUtil.getDurabilityByColor(color.charAt(1))); - } else if (item.getType().name().startsWith("LEATHER_")) { - Color c = StringUtil.translateChatColorToColor(Objects.requireNonNull(ChatColor.getByChar(color.charAt(1)))); - - if (c != null) { - LeatherArmorMeta lch = (LeatherArmorMeta) item.getItemMeta(); - lch.setColor(c); - item.setItemMeta(lch); - } - } - - return item; - } - - @Override - public ItemStack getPotionItem(String string) { - try { - if (string.contains("::")) { - String[] split = string.split("::"); - ItemStack itemStack = new ItemStack(Material.valueOf(split[0])); - - if (itemStack.getType() == Material.POTION) { - itemStack.setDurability((((short) Integer.parseInt(split[1])))); - } - return itemStack; - } - } catch (Exception e) { - Common.sendConsoleMMMessage("Invalid item: " + string); - } - return null; - } - - @Override - public boolean isUnbreakable(ItemStack item) { - if (item.hasItemMeta() && item.getItemMeta() != null) { - item.getItemMeta().spigot().isUnbreakable(); - } - return false; - } - - @Override - public ItemMeta setUnbreakable(ItemMeta itemMeta, boolean unbreakable) { - if (itemMeta != null) { - itemMeta.spigot().setUnbreakable(unbreakable); - } - return itemMeta; - } - - @Override - public ItemStack setDurability(ItemStack itemStack, int durability) { - itemStack.setDurability((short) (itemStack.getType().getMaxDurability() - durability)); - return itemStack; - } - - @Override - public void placeTnt(BlockPlaceEvent e, Match match) { - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - if (e.isCancelled()) { - return; - } - - Block block = e.getBlock(); - block.setType(Material.AIR); - block.getState().setData(new MaterialData(Material.AIR)); - block.getState().update(); - - TNTPrimed tnt = (TNTPrimed) block.getWorld().spawnEntity(block.getLocation().subtract(-0.5, 0, -0.5), EntityType.PRIMED_TNT); - tnt.setMetadata(FIGHT_ENTITY, new FixedMetadataValue(ZonePractice.getInstance(), match)); - tnt.setIsIncendiary(false); - - if (match.getLadder() instanceof FireballFight) { - tnt.setMetadata(FireballFight.FIREBALL_FIGHT_TNT, new FixedMetadataValue(ZonePractice.getInstance(), match)); - tnt.setMetadata(FireballFight.FIREBALL_FIGHT_TNT_SHOOTER, new FixedMetadataValue(ZonePractice.getInstance(), e.getPlayer())); - } - }, 2L); - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LegacyConfigItemProvider.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LegacyConfigItemProvider.java deleted file mode 100644 index 473f02bd4..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LegacyConfigItemProvider.java +++ /dev/null @@ -1,97 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.manager.gui.GUIItem; -import dev.nandi0813.practice.module.interfaces.ConfigItemProvider; -import dev.nandi0813.practice.util.Common; -import org.bukkit.Material; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemFlag; - -import java.util.List; - -/** - * Legacy (1.8.8) implementation of ConfigItemProvider. - * In 1.8, the DAMAGE value is used for item data/color (e.g., wool colors, glass colors). - */ -public class LegacyConfigItemProvider implements ConfigItemProvider { - - @Override - public GUIItem getGuiItem(YamlConfiguration config, String loc) { - GUIItem guiItem = new GUIItem(); - - if (config.isString(loc + ".NAME")) { - guiItem.setName(config.getString(loc + ".NAME")); - } - - if (config.isString(loc + ".MATERIAL")) { - guiItem.setMaterial(Material.valueOf(config.getString(loc + ".MATERIAL"))); - } - - if (config.isInt(loc + ".AMOUNT")) { - int amount = config.getInt(loc + ".AMOUNT"); - if (amount <= 0 || amount > 64) { - amount = 1; - } - guiItem.setAmount(amount); - } - - if (config.isInt(loc + ".DURABILITY")) { - int durability = config.getInt(loc + ".DURABILITY"); - if (durability < 0) { - durability = 1; - } - guiItem.setDurability(durability); - } - - // In 1.8, DAMAGE is used for item data (colors, variants, etc.) - if (config.isInt(loc + ".DAMAGE")) { - short damage = (short) config.getInt(loc + ".DAMAGE"); - - if (damage != 0) { - guiItem.setDamage(damage); - } - } - - if (config.isList(loc + ".LORE")) { - guiItem.setLore(config.getStringList(loc + ".LORE")); - } - - if (config.isList(loc + ".FLAGS")) { - List flags = config.getStringList(loc + ".FLAGS"); - for (String flag : flags) { - try { - ItemFlag itemFlag = ItemFlag.valueOf(flag); - guiItem.addItemFlag(itemFlag); - } catch (IllegalArgumentException e) { - Common.sendConsoleMMMessage("Invalid ItemFlag: " + flag); - } - } - } - - if (config.isList(loc + ".ENCHANTMENTS")) { - for (String s : config.getStringList(loc + ".ENCHANTMENTS")) { - String[] enchantmentSplit = s.split(":"); - if (enchantmentSplit.length != 2) { - continue; - } - - try { - Enchantment enchantment = Enchantment.getByName(enchantmentSplit[0]); - int level = Integer.parseInt(enchantmentSplit[1]); - - if (enchantment.getStartLevel() > level) { - level = enchantment.getStartLevel(); - } - - guiItem.addEnchantment(enchantment, level); - } catch (Exception e) { - Common.sendConsoleMMMessage("Enchantment not found: " + e); - } - } - } - - return guiItem; - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LegacyItemCooldownHandler.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LegacyItemCooldownHandler.java deleted file mode 100644 index a5c1f04ba..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/LegacyItemCooldownHandler.java +++ /dev/null @@ -1,158 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.manager.fight.util.FightPlayer; -import dev.nandi0813.practice_1_8_8.cooldown.EnderPearlRunnable; -import dev.nandi0813.practice_1_8_8.cooldown.FireworkRocketRunnable; -import dev.nandi0813.practice.module.interfaces.ItemCooldownHandler; -import dev.nandi0813.practice.util.Common; -import dev.nandi0813.practice.util.StringUtil; -import dev.nandi0813.practice.util.cooldown.CooldownObject; -import dev.nandi0813.practice_1_8_8.cooldown.GoldenAppleRunnable; -import dev.nandi0813.practice.util.cooldown.PlayerCooldown; -import dev.nandi0813.practice_1_8_8.cooldown.FireballRunnable; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.player.PlayerInteractEvent; - -/** - * Legacy (1.8.8) implementation of {@link ItemCooldownHandler}. - * - *

    When a cooldown is active the action is cancelled, the player's inventory - * is refreshed, and a chat message is sent with the remaining time. - * No native hotbar cooldown visualisation is available on 1.8.8. - */ -public class LegacyItemCooldownHandler implements ItemCooldownHandler { - - // ------------------------------------------------------------------------- - // Ender Pearl - // ------------------------------------------------------------------------- - - @Override - public void handleEnderPearlFFA(Player player, FightPlayer fightPlayer, int duration, boolean expBar, - Cancellable event, String langKey) { - if (PlayerCooldown.isActive(player, CooldownObject.ENDER_PEARL)) { - Common.sendMMMessage(player, StringUtil.replaceSecondString( - LanguageManager.getString(langKey), - PlayerCooldown.getLeftInDouble(player, CooldownObject.ENDER_PEARL))); - event.setCancelled(true); - refreshInventory(event, player); - } else { - EnderPearlRunnable runnable = new EnderPearlRunnable(player, fightPlayer, duration, expBar); - runnable.begin(); - } - } - - @Override - public void handleEnderPearlMatch(Player player, FightPlayer fightPlayer, int duration, boolean expBar, - Cancellable event, String langKey) { - if (PlayerCooldown.isActive(player, CooldownObject.ENDER_PEARL)) { - Common.sendMMMessage(player, StringUtil.replaceSecondString( - LanguageManager.getString(langKey), - PlayerCooldown.getLeftInDouble(player, CooldownObject.ENDER_PEARL))); - event.setCancelled(true); - refreshInventory(event, player); - } else { - EnderPearlRunnable runnable = new EnderPearlRunnable(player, fightPlayer, duration, expBar); - runnable.begin(); - } - } - - // ------------------------------------------------------------------------- - // Golden Apple - // ------------------------------------------------------------------------- - - @Override - public void handleGoldenAppleFFA(Player player, int duration, Cancellable event, String langKey) { - if (PlayerCooldown.isActive(player, CooldownObject.GOLDEN_APPLE)) { - event.setCancelled(true); - Common.sendMMMessage(player, StringUtil.replaceSecondString( - LanguageManager.getString(langKey), - PlayerCooldown.getLeftInDouble(player, CooldownObject.GOLDEN_APPLE))); - player.updateInventory(); - } else { - GoldenAppleRunnable runnable = new GoldenAppleRunnable(player, duration); - runnable.begin(); - } - } - - @Override - public void handleGoldenAppleMatch(Player player, int duration, Cancellable event, String langKey) { - if (PlayerCooldown.isActive(player, CooldownObject.GOLDEN_APPLE)) { - event.setCancelled(true); - Common.sendMMMessage(player, StringUtil.replaceSecondString( - LanguageManager.getString(langKey), - PlayerCooldown.getLeftInDouble(player, CooldownObject.GOLDEN_APPLE))); - player.updateInventory(); - } else { - GoldenAppleRunnable runnable = new GoldenAppleRunnable(player, duration); - runnable.begin(); - } - } - - // ------------------------------------------------------------------------- - // Firework Rocket - // ------------------------------------------------------------------------- - - @Override - public void handleFireworkRocketFFA(Player player, FightPlayer fightPlayer, int duration, - Cancellable event, String langKey) { - if (PlayerCooldown.isActive(player, CooldownObject.FIREWORK_ROCKET)) { - Common.sendMMMessage(player, StringUtil.replaceSecondString( - LanguageManager.getString(langKey), - PlayerCooldown.getLeftInDouble(player, CooldownObject.FIREWORK_ROCKET))); - event.setCancelled(true); - refreshInventory(event, player); - } else { - FireworkRocketRunnable runnable = new FireworkRocketRunnable(player, fightPlayer, duration, false); - runnable.begin(); - } - } - - @Override - public void handleFireworkRocketMatch(Player player, FightPlayer fightPlayer, int duration, - Cancellable event, String langKey) { - if (PlayerCooldown.isActive(player, CooldownObject.FIREWORK_ROCKET)) { - Common.sendMMMessage(player, StringUtil.replaceSecondString( - LanguageManager.getString(langKey), - PlayerCooldown.getLeftInDouble(player, CooldownObject.FIREWORK_ROCKET))); - event.setCancelled(true); - refreshInventory(event, player); - } else { - FireworkRocketRunnable runnable = new FireworkRocketRunnable(player, fightPlayer, duration, false); - runnable.begin(); - } - } - - // ------------------------------------------------------------------------- - // Helpers - // ------------------------------------------------------------------------- - - /** Calls {@link Player#updateInventory()} when the underlying event is a {@link PlayerInteractEvent}. */ - private static void refreshInventory(Cancellable event, Player player) { - if (event instanceof PlayerInteractEvent) { - player.updateInventory(); - } - } - - // ------------------------------------------------------------------------- - // Fireball - // ------------------------------------------------------------------------- - - @Override - public boolean handleFireballMatch(Player player, double duration, String langKey) { - if (PlayerCooldown.isActive(player, CooldownObject.FIREBALL_FIGHT_FIREBALL)) { - Common.sendMMMessage(player, StringUtil.replaceSecondString( - LanguageManager.getString(langKey), - PlayerCooldown.getLeftInDouble(player, CooldownObject.FIREBALL_FIGHT_FIREBALL))); - return false; - } else { - FireballRunnable fireballRunnable = new FireballRunnable(player, duration); - fireballRunnable.begin(); - return true; - } - } -} - - - diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/PlayerHiderUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/PlayerHiderUtil.java deleted file mode 100644 index fba12d1ce..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/PlayerHiderUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.module.interfaces.PlayerHiderInterface; -import net.minecraft.server.v1_8_R3.EntityPlayer; -import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; -import org.bukkit.entity.Player; - -public class PlayerHiderUtil implements PlayerHiderInterface { - - @Override - public void hidePlayer(Player observer, Player target, boolean fullHide) { - if (observer.canSee(target)) - observer.hidePlayer(target); - - EntityPlayer entityTarget = ((CraftPlayer) target).getHandle(); - - PacketPlayOutPlayerInfo packet; - if (!fullHide) { - packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, entityTarget); - } else { - packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entityTarget); - } - ((CraftPlayer) observer).getHandle().playerConnection.sendPacket(packet); - } - - @Override - public void showPlayer(Player observer, Player target) { - observer.showPlayer(target); - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/PlayerUtil.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/PlayerUtil.java deleted file mode 100644 index bdb337b52..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/PlayerUtil.java +++ /dev/null @@ -1,217 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.util.StringUtil; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Fireball; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.List; - -public class PlayerUtil implements dev.nandi0813.practice.module.interfaces.PlayerUtil { - - @Override - public ItemStack getPlayerMainHand(Player player) { - return player.getItemInHand(); - } - - @Override - public boolean isItemInUse(Player player, Material material) { - ItemStack itemInHand = player.getInventory().getItemInHand(); - return itemInHand != null && itemInHand.getType().equals(material); - } - - @Override - public ItemStack getItemInUse(Player player, Material material) { - ItemStack itemInHand = player.getInventory().getItemInHand(); - if (itemInHand != null && itemInHand.getType().equals(material)) { - return itemInHand; - } else { - return null; - } - } - - @Override - public void setItemInUseIf(Player player, Material material, ItemStack itemStack) { - ItemStack itemInHand = player.getInventory().getItemInHand(); - if (itemInHand != null && itemInHand.getType().equals(material)) { - player.setItemInHand(itemStack); - } - } - - @Override - public List dropPlayerInventory(Player player) { - List entities = new ArrayList<>(); - - for (ItemStack item : player.getInventory().getContents()) { - if (item == null) continue; - if (item.getType().equals(Material.AIR)) continue; - - entities.add(player.getWorld().dropItemNaturally(player.getLocation(), item)); - } - for (ItemStack item : player.getInventory().getArmorContents()) { - if (item == null) continue; - if (item.getType().equals(Material.AIR)) continue; - - entities.add(player.getWorld().dropItemNaturally(player.getLocation(), item)); - } - this.clearInventory(player); - - return entities; - } - - @Override - public void clearInventory(Player player) { - player.getInventory().clear(); - player.getInventory().setArmorContents(null); - player.updateInventory(); - } - - @Override - public void setCollidesWithEntities(Player player, boolean bool) { - player.spigot().setCollidesWithEntities(bool); - } - - @Override - public int getPing(Player player) { - return player.spigot().getPing(); - } - - @Override - public ItemStack[] getInventoryStorageContent(Player player) { - return player.getInventory().getContents(); - } - - @Override - public double getPlayerHealth(Player player) { - return player.getHealth(); - } - - @Override - public void setActiveInventoryTitle(Player player, String title) { - } - - @Override - public void setPlayerListName(Player player, Component component) { - player.setPlayerListName(StringUtil.CC(LegacyComponentSerializer.legacyAmpersand().serialize(component))); - } - - @Override - public Fireball shootFireball(Player player, double speed) { - Vector direction = player.getEyeLocation().getDirection(); - - final Fireball fireball = player.launchProjectile(Fireball.class); - fireball.setVelocity(direction.multiply(speed)); - return fireball; - } - - @Override - public void applyFireballKnockback(final Player player, final Fireball fireball) { - final Location playerLoc = player.getLocation(); - final Location fireballLoc = fireball.getLocation(); - final float yield = fireball.getYield() > 0 ? fireball.getYield() : 1.0f; - - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - double dx = playerLoc.getX() - fireballLoc.getX(); - double dz = playerLoc.getZ() - fireballLoc.getZ(); - double horizontalDistance = Math.sqrt(dx * dx + dz * dz); - - // Use only horizontal distance for factor calculation so that jumping - // (which only increases vertical separation) does not reduce the knockback strength. - double effectiveDistance = horizontalDistance; - - double safeDistance = 0.6; - double factor = 1.0; - - if (effectiveDistance > safeDistance) { - double decayRange = yield * 2.0; - factor = 1.0 - ((effectiveDistance - safeDistance) / decayRange); - } - - if (factor < 0) factor = 0; - if (factor > 1) factor = 1; - - // Compute horizontal direction separately so the vertical component - // of the direction vector doesn't steal from horizontal velocity. - double horizontalLen = Math.sqrt(dx * dx + dz * dz); - double horizDirX; - double horizDirZ; - - if (horizontalLen < 0.001) { - // Fireball is almost directly below – pick the player's facing direction - Vector facing = playerLoc.getDirection(); - double facingLen = Math.sqrt(facing.getX() * facing.getX() + facing.getZ() * facing.getZ()); - if (facingLen < 0.001) { - horizDirX = 0; - horizDirZ = 0; - } else { - horizDirX = facing.getX() / facingLen; - horizDirZ = facing.getZ() / facingLen; - } - } else { - horizDirX = dx / horizontalLen; - horizDirZ = dz / horizontalLen; - } - - // Apply a slight reduction when airborne so it's weaker than grounded, but not drastically - double airMultiplier = player.isOnGround() ? 1.0 : 0.8; - - Vector velocity = new Vector( - horizDirX * FB_VELOCITY_HORIZONTAL_MULTIPLICATIVE * factor * airMultiplier, - FB_VELOCITY_VERTICAL_MULTIPLICATIVE * factor, - horizDirZ * FB_VELOCITY_HORIZONTAL_MULTIPLICATIVE * factor * airMultiplier - ); - - player.setVelocity(velocity); - }, 1L); - } - - @Override - public void applyTntKnockback(Player player, TNTPrimed tnt) { - final Location playerLoc = player.getLocation(); - final Location tntLoc = tnt.getLocation(); - - final float yield = 4.0f; - - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - double distance = playerLoc.distance(tntLoc); - - double impactRadius = yield * 1.3; - double factor = 1.0 - (distance / impactRadius); - - if (factor <= 0.1) return; - if (factor > 1) factor = 1; - - Vector direction = playerLoc.toVector().subtract(tntLoc.toVector()); - if (direction.lengthSquared() == 0) { - direction = new Vector(0, 0.1, 0); - } else { - direction.normalize(); - } - - Vector velocity = new Vector( - direction.getX() * TNT_VELOCITY_HORIZONTAL_MULTIPLICATIVE * factor, - TNT_VELOCITY_VERTICAL_MULTIPLICATIVE * factor, - direction.getZ() * TNT_VELOCITY_HORIZONTAL_MULTIPLICATIVE * factor - ); - - player.setVelocity(velocity); - }, 1L); - } - - @Override - public void setAttackSpeed(Player player, int hitDelay) { - // No-op for 1.8.8 - attack speed attribute doesn't exist - // Hit delay is handled by setMaximumNoDamageTicks in the core - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/StatisticListener.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/StatisticListener.java deleted file mode 100644 index 4609a4585..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/StatisticListener.java +++ /dev/null @@ -1,156 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.ffa.FFAManager; -import dev.nandi0813.practice.manager.fight.ffa.game.FFA; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.fight.match.MatchManager; -import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.module.util.ClassImport; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.entity.ThrownPotion; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.PotionSplashEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.scheduler.BukkitRunnable; - -public class StatisticListener extends dev.nandi0813.practice.module.interfaces.StatisticListener implements Listener { - - @Override - public void onClick(PlayerInteractEvent e) { - Player player = e.getPlayer(); - Profile profile = ProfileManager.getInstance().getProfile(player); - - if (ClassImport.getClasses().getPlayerUtil().getPlayerMainHand(player) != null && player.getItemInHand().getType() == Material.FISHING_ROD) - return; - - Statistic statistic = null; - switch (profile.getStatus()) { - case MATCH: - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match != null && match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) { - statistic = match.getCurrentStat(player); - } - break; - case FFA: - FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); - if (ffa != null) { - statistic = ffa.getStatistics().get(player); - } - break; - } - - if (!e.getAction().equals(Action.LEFT_CLICK_AIR) && !e.getAction().equals(Action.LEFT_CLICK_BLOCK)) { - return; - } - - if (statistic == null || statistic.isSet()) { - return; - } - - CURRENT_CPS.putIfAbsent(player, 1); - CURRENT_CPS.computeIfPresent(player, (key, val) -> val + 1); - - BukkitRunnable task = cpsRunnable(statistic, player); - task.runTaskLaterAsynchronously(ZonePractice.getInstance(), 20L); - } - - @EventHandler ( priority = EventPriority.LOWEST ) - public void onPlayerHit(EntityDamageByEntityEvent e) { - if (e.isCancelled()) return; - - if (!(e.getDamager() instanceof Player)) return; - Player attacker = (Player) e.getDamager(); - Profile attackerProfile = ProfileManager.getInstance().getProfile(attacker); - - if (!(e.getEntity() instanceof Player)) return; - Player defender = (Player) e.getEntity(); - Profile defenderProfile = ProfileManager.getInstance().getProfile(defender); - - Bukkit.getScheduler().runTaskAsynchronously(practice, () -> - { - Statistic attackerStats = null; - Statistic defenderStats = null; - switch (attackerProfile.getStatus()) { - case MATCH: - if (!defenderProfile.getStatus().equals(ProfileStatus.MATCH)) - return; - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(attacker); - if (match == null) - return; - if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) - return; - - attackerStats = match.getCurrentStat(attacker); - defenderStats = match.getCurrentStat(defender); - break; - case FFA: - FFA ffa = FFAManager.getInstance().getFFAByPlayer(attacker); - if (ffa == null) - return; - - attackerStats = ffa.getStatistics().get(attacker); - defenderStats = ffa.getStatistics().get(defender); - break; - } - - if (attackerStats == null) return; - if (attackerStats.isSet()) return; - - BukkitRunnable task = hitRunnable(attacker, attackerStats, defender, defenderStats); - task.runTaskAsynchronously(ZonePractice.getInstance()); - }); - } - - @EventHandler ( priority = EventPriority.LOWEST ) - public void onPotionSplash(PotionSplashEvent e) { - ThrownPotion potion = e.getPotion(); - if (!(potion.getShooter() instanceof Player)) return; - Player player = (Player) potion.getShooter(); - - Profile profile = ProfileManager.getInstance().getProfile(player); - - Statistic statistic = null; - switch (profile.getStatus()) { - case MATCH: - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match == null) - return; - - statistic = match.getCurrentStat(player); - break; - case FFA: - FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); - if (ffa == null) - return; - - statistic = ffa.getStatistics().get(player); - break; - } - - if (statistic == null || statistic.isSet()) { - return; - } - - // Check if the potion is a health potion - if (potion.getItem().getDurability() == 16421) { - statistic.setPotionThrown(statistic.getPotionThrown() + 1); - - if (!e.getAffectedEntities().contains(player)) { - statistic.setPotionMissed(statistic.getPotionMissed() + 1); - } - } - } - -} \ No newline at end of file diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/WorldCreate.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/WorldCreate.java deleted file mode 100644 index e7636fdc1..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/interfaces/WorldCreate.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.nandi0813.practice_1_8_8.interfaces; - -import org.bukkit.World; -import org.bukkit.WorldCreator; -import org.bukkit.WorldType; - -public class WorldCreate implements dev.nandi0813.practice.module.interfaces.WorldCreate { - - @Override - public World createEmptyWorld(String worldName) { - WorldCreator wc = new WorldCreator(worldName); - wc.type(WorldType.FLAT); - wc.generatorSettings("2;0;1;"); - return wc.createWorld(); - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/ArenaListener.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/ArenaListener.java deleted file mode 100644 index c060f9db1..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/ArenaListener.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.nandi0813.practice_1_8_8.listener; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.ChunkUnloadEvent; - -import static dev.nandi0813.practice.manager.arena.ArenaManager.LOADED_CHUNKS; -import static dev.nandi0813.practice.manager.arena.ArenaManager.LOAD_CHUNKS; - -public class ArenaListener implements Listener { - - @EventHandler - public void onChunkUnload(ChunkUnloadEvent e) { - if (LOAD_CHUNKS) { - if (LOADED_CHUNKS.contains(e.getChunk())) { - e.setCancelled(true); - } - } - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/FFAListener.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/FFAListener.java deleted file mode 100644 index 81f7dde2f..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/FFAListener.java +++ /dev/null @@ -1,67 +0,0 @@ -package dev.nandi0813.practice_1_8_8.listener; - -import dev.nandi0813.practice.manager.fight.ffa.FFAManager; -import dev.nandi0813.practice.manager.fight.ffa.game.FFA; -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import dev.nandi0813.practice.manager.fight.util.FightUtil; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; - -public class FFAListener extends dev.nandi0813.practice.manager.fight.ffa.FFAListener { - - @EventHandler - public void onPlayerDamage(EntityDamageEvent e) { - if (!(e.getEntity() instanceof Player)) return; - Player player = (Player) e.getEntity(); - - Profile profile = ProfileManager.getInstance().getProfile(player); - if (profile == null) return; - - FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); - if (ffa == null) return; - - if (e instanceof EntityDamageByEntityEvent) { - onEntityDamageByEntity((EntityDamageByEntityEvent) e); - } - - if (player.getHealth() - e.getFinalDamage() <= 0) { - e.setDamage(0); - - if (e instanceof EntityDamageByEntityEvent) { - Player killer = FightUtil.getKiller(((EntityDamageByEntityEvent) e).getDamager()); - - ffa.killPlayer(player, killer, DeathCause.convert(e.getCause()).getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")); - - if (killer != null) { - Statistic statistic = ffa.getStatistics().get(killer); - statistic.setKills(statistic.getKills() + 1); - } - } else - ffa.killPlayer(player, null, DeathCause.convert(e.getCause()).getMessage()); - } - } - - private static void onEntityDamageByEntity(EntityDamageByEntityEvent e) { - if (!(e.getEntity() instanceof Player)) return; - Player target = (Player) e.getEntity(); - - if (e.getDamager() instanceof Projectile) { - Projectile projectile = (Projectile) e.getDamager(); - if (projectile.getShooter() instanceof Player) { - Player attacker = (Player) projectile.getShooter(); - - if (projectile instanceof Arrow) { - arrowDisplayHearth(attacker, target, e.getFinalDamage()); - } - } - } - } - -} diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/MatchListener.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/MatchListener.java deleted file mode 100644 index 14c4b8b5d..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/MatchListener.java +++ /dev/null @@ -1,135 +0,0 @@ -package dev.nandi0813.practice_1_8_8.listener; - -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.fight.match.MatchManager; -import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; -import dev.nandi0813.practice.manager.fight.match.listener.LadderTypeListener; -import dev.nandi0813.practice.manager.fight.match.util.KnockbackUtil; -import dev.nandi0813.practice.manager.fight.match.util.TeamUtil; -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import dev.nandi0813.practice.manager.fight.util.FightUtil; -import dev.nandi0813.practice.manager.fight.util.ListenerUtil; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; -import dev.nandi0813.practice.manager.ladder.enums.KnockbackType; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; - -public class MatchListener extends LadderTypeListener implements Listener { - - @EventHandler - public void onPlayerDamage(EntityDamageEvent e) { - if (!(e.getEntity() instanceof Player)) return; - Player player = (Player) e.getEntity(); - - Profile profile = ProfileManager.getInstance().getProfile(player); - if (profile == null) return; - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match == null) return; - - if (ListenerUtil.cancelEvent(match, player)) { - e.setDamage(0); - e.setCancelled(true); - return; - } - - if (e instanceof EntityDamageByEntityEvent) { - onEntityDamageByEntity((EntityDamageByEntityEvent) e); - } - - if (match.getLadder() instanceof LadderHandle) { - ((LadderHandle) match.getLadder()).handleEvents(e, match); - } - - if (e.isCancelled()) { - return; - } - - if (player.getHealth() - e.getFinalDamage() <= 0) { - e.setDamage(0); - - DeathCause cause = DeathCause.convert(e.getCause()); - - if (e instanceof EntityDamageByEntityEvent) { - Player killer = FightUtil.getKiller(((EntityDamageByEntityEvent) e).getDamager()); - - match.killPlayer(player, killer, cause.getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")); - - if (killer != null) { - Statistic statistic = match.getCurrentStat(killer); - statistic.setKills(statistic.getKills() + 1); - } - } else { - match.killPlayer(player, null, cause.getMessage()); - } - } - } - - private static void onEntityDamageByEntity(EntityDamageByEntityEvent e) { - if (!(e.getEntity() instanceof Player)) return; - Player target = (Player) e.getEntity(); - - Player attacker = null; - if (e.getDamager() instanceof Player) { - attacker = (Player) e.getDamager(); - } else if (e.getDamager() instanceof Projectile) { - Projectile projectile = (Projectile) e.getDamager(); - - if (projectile.getShooter() instanceof Player) { - attacker = (Player) projectile.getShooter(); - - if (projectile instanceof Arrow) { - arrowDisplayHearth(attacker, target, e.getFinalDamage()); - } - } - } - - if (attacker == null) return; - - Profile attackerProfile = ProfileManager.getInstance().getProfile(attacker); - Profile targetProfile = ProfileManager.getInstance().getProfile(target); - - if (attackerProfile == null) return; - if (targetProfile == null) return; - if (!attackerProfile.getStatus().equals(ProfileStatus.MATCH)) return; - if (!targetProfile.getStatus().equals(ProfileStatus.MATCH)) return; - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(attacker); - if (!match.equals(MatchManager.getInstance().getLiveMatchByPlayer(target))) return; - - if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) return; - - boolean cancel = match.getCurrentStat(attacker).isSet() || match.getCurrentStat(target).isSet(); - - if (!cancel) { - cancel = TeamUtil.isSaveTeamMate(match, attacker, target); - } - - if (cancel) { - e.setCancelled(true); - return; - } else { - if (match.getLadder() instanceof LadderHandle) { - ((LadderHandle) match.getLadder()).handleEvents(e, match); - } - } - - // Always record the attacker for void-kill attribution, - // regardless of whether the event was cancelled by a ladder handler. - match.recordAttack(target, attacker); - - if (!e.isCancelled() && !match.getLadder().getLadderKnockback().getKnockbackType().equals(KnockbackType.DEFAULT)) { - KnockbackUtil.setPlayerKnockback(target, match.getLadder().getLadderKnockback().getKnockbackType()); - } - } - -} \ No newline at end of file diff --git a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/PlayerChatListener.java b/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/PlayerChatListener.java deleted file mode 100644 index dee256a86..000000000 --- a/spigot_1_8_8/src/main/java/dev/nandi0813/practice_1_8_8/listener/PlayerChatListener.java +++ /dev/null @@ -1,80 +0,0 @@ -package dev.nandi0813.practice_1_8_8.listener; - -import dev.nandi0813.practice.manager.backend.ConfigManager; -import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.manager.party.Party; -import dev.nandi0813.practice.manager.party.PartyManager; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.util.ChatFormatUtil; -import dev.nandi0813.practice.util.Common; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; - -public class PlayerChatListener implements Listener { - - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerChat(AsyncPlayerChatEvent e) { - Player player = e.getPlayer(); - Profile profile = ProfileManager.getInstance().getProfile(player); - Party party = PartyManager.getInstance().getParty(player); - String message = e.getMessage(); - - // --- Party chat --- - if (ConfigManager.getBoolean("CHAT.PARTY-CHAT-ENABLED") && profile.isParty() && party != null && message.startsWith("@")) { - if (party.isPartyChat() || party.getLeader() == player) { - e.getRecipients().clear(); - e.getRecipients().addAll(party.getMembers()); - applyLegacyFormat(e, ChatFormatUtil.buildPartyChatMessage(player, message)); - } else { - e.setCancelled(true); - final String cantUse = LanguageManager.getString("PARTY.CANT-USE-PARTY-CHAT"); - Bukkit.getScheduler().runTask(dev.nandi0813.practice.ZonePractice.getInstance(), - () -> Common.sendMMMessage(player, cantUse)); - } - return; - } - - // --- Staff chat (toggle) --- - if (profile.isStaffChat()) { - applyStaffChat(e, player, message); - return; - } - - // --- Staff chat (shortcut: #message) --- - if (player.hasPermission("zpp.staff") && ConfigManager.getBoolean("CHAT.STAFF-CHAT.SHORTCUT") && message.startsWith("#")) { - applyStaffChat(e, player, message.replaceFirst("#", "")); - return; - } - - // --- Custom server chat --- - if (ConfigManager.getBoolean("CHAT.SERVER-CHAT-ENABLED")) { - applyLegacyFormat(e, ChatFormatUtil.buildServerChatMessage(profile, player, message)); - } - } - - /** - * Restricts recipients to staff and applies the staff chat format. - */ - private void applyStaffChat(AsyncPlayerChatEvent e, Player player, String rawMessage) { - e.getRecipients().clear(); - e.getRecipients().addAll(ChatFormatUtil.getStaffRecipients()); - applyLegacyFormat(e, ChatFormatUtil.buildStaffChatMessage(player, rawMessage)); - } - - /** - * Serialises a MiniMessage string to a legacy §-coloured string and injects - * it into the event via setFormat / setMessage so Bukkit delivers it natively. - */ - private void applyLegacyFormat(AsyncPlayerChatEvent e, String miniMessageString) { - String legacy = LegacyComponentSerializer.legacySection() - .serialize(Common.deserializeMiniMessage(miniMessageString)); - e.setFormat("%2$s"); - e.setMessage(legacy); - } -} diff --git a/spigot_modern/pom.xml b/spigot_modern/pom.xml deleted file mode 100644 index 6b4f54e77..000000000 --- a/spigot_modern/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - 4.0.0 - - - dev.nandi0813 - practice-parent - 6.4.6-SNAPSHOT - - - practice-spigot_modern - - - - - enginehub - https://maven.enginehub.org/repo/ - - - - - - - - com.intellectualsites.bom - bom-newest - 1.55 - import - pom - - - - - - - io.papermc.paper - paper-api - 1.21.11-R0.1-SNAPSHOT - provided - - - - dev.nandi0813 - practice-core - ${project.parent.version} - provided - - - - - com.fastasyncworldedit - FastAsyncWorldEdit-Core - provided - - - - com.fastasyncworldedit - FastAsyncWorldEdit-Bukkit - provided - - - FastAsyncWorldEdit-Core - * - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 21 - 21 - - - - - - diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/Classes.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/Classes.java deleted file mode 100644 index e15263bd3..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/Classes.java +++ /dev/null @@ -1,52 +0,0 @@ -package dev.nandi0813.practice_modern; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.module.interfaces.*; -import dev.nandi0813.practice_modern.interfaces.BuildListener; -import dev.nandi0813.practice_modern.interfaces.ModernItemCooldownHandler; -import dev.nandi0813.practice_modern.interfaces.PlayerHiderUtil; -import dev.nandi0813.practice_modern.listener.*; -import dev.nandi0813.practice_modern.modern_version.ItemOffHand; -import lombok.Getter; -import org.bukkit.Bukkit; - -@Getter -public class Classes implements dev.nandi0813.practice.module.util.Classes { - - public WorldCreate worldCreate = new dev.nandi0813.practice_modern.interfaces.WorldCreate(); - public PlayerHiderInterface playerHiderUtil = new PlayerHiderUtil(); - public ItemMaterialUtil itemMaterialUtil = new dev.nandi0813.practice_modern.interfaces.ItemMaterialUtil(); - public LadderUtil ladderUtil = new dev.nandi0813.practice_modern.interfaces.LadderUtil(); - public ItemCreateUtil itemCreateUtil = new dev.nandi0813.practice_modern.interfaces.ItemCreateUtil(); - public PlayerUtil playerUtil = new dev.nandi0813.practice_modern.interfaces.PlayerUtil(); - public ArenaUtil arenaUtil = new dev.nandi0813.practice_modern.interfaces.ArenaUtil(); - public ArenaCopyUtil arenaCopyUtil = new dev.nandi0813.practice_modern.interfaces.ArenaCopy.ArenaCopyUtil(); - - public BedUtil bedUtil = new dev.nandi0813.practice_modern.interfaces.BedUtil(); - public EntityHider entityHider = new dev.nandi0813.practice_modern.interfaces.EntityHider(ZonePractice.getInstance(), EntityHider.Policy.BLACKLIST); - public StatisticListener statisticListener = new dev.nandi0813.practice_modern.interfaces.StatisticListener(); - public ConfigItemProvider configItemProvider = new dev.nandi0813.practice_modern.interfaces.ModernConfigItemProvider(); - public AbstractBuildListener buildListener = new BuildListener(); - - public Class changedBlockClass = dev.nandi0813.practice_modern.interfaces.ChangedBlock.class; - public Class kitDataClass = dev.nandi0813.practice_modern.interfaces.KitData.class; - public Class actionBarClass = dev.nandi0813.practice_modern.interfaces.ActionBar.class; - - public ItemCooldownHandler itemCooldownHandler = new ModernItemCooldownHandler(); - - public Classes() { - Bukkit.getServer().getPluginManager().registerEvents(arenaCopyUtil, ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(statisticListener, ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new MatchListener(), ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new FFAListener(), ZonePractice.getInstance()); - - // Only 1.20 stuff - Bukkit.getServer().getPluginManager().registerEvents(new ItemOffHand(), ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new ArenaListener(), ZonePractice.getInstance()); - - Bukkit.getServer().getPluginManager().registerEvents(new EPCountdownListener(), ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new FireworkRocketCooldownListener(), ZonePractice.getInstance()); - Bukkit.getServer().getPluginManager().registerEvents(new PlayerChatListener(), ZonePractice.getInstance()); - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ActionBar.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ActionBar.java deleted file mode 100644 index 803c2238b..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ActionBar.java +++ /dev/null @@ -1,29 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import dev.nandi0813.practice.manager.profile.Profile; -import net.kyori.adventure.text.Component; -import org.bukkit.entity.Player; - -public class ActionBar extends dev.nandi0813.practice.module.interfaces.actionbar.ActionBar { - - public ActionBar(Profile profile) { - super(profile); - } - - @Override - public void send() { - Player player = profile.getPlayer().getPlayer(); - if (player != null) { - player.sendActionBar(this.message); - } - } - - @Override - public void clear() { - Player player = profile.getPlayer().getPlayer(); - if (player != null) { - player.sendActionBar(Component.empty()); - } - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaCopy/ArenaCopyUtil.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaCopy/ArenaCopyUtil.java deleted file mode 100644 index ed603536f..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaCopy/ArenaCopyUtil.java +++ /dev/null @@ -1,59 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces.ArenaCopy; - -import dev.nandi0813.practice.manager.arena.arenas.ArenaCopy; -import dev.nandi0813.practice.manager.gui.GUIManager; -import dev.nandi0813.practice.manager.gui.GUIType; -import dev.nandi0813.practice.manager.gui.setup.arena.ArenaGUISetupManager; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.util.Cuboid; -import dev.nandi0813.practice.util.SoftDependUtil; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; - -public class ArenaCopyUtil extends dev.nandi0813.practice.module.interfaces.ArenaCopyUtil { - - @Override - protected void copyBlock(Block oldBlock, Block newBlock) { - try { - // OPTIMIZATION: Set type without physics for massive speedup - newBlock.setType(oldBlock.getType(), false); - - BlockState oldState = oldBlock.getState(); - BlockState newState = newBlock.getState(); - - // Clone block data - newState.setBlockData(oldState.getBlockData().clone()); - newState.update(true, false); // force=true, applyPhysics=false - - newBlock.setBiome(oldBlock.getBiome()); - } catch (Exception e) { - // Skip problematic blocks (e.g., MaterialData type incompatibilities) - // This allows the copy process to continue without halting - } - } - - @Override - protected void copyArena(Profile profile, ArenaCopy arenaCopy, Cuboid copyFrom, Location reference, Location newLocation) { - if (SoftDependUtil.isFAWE_ENABLED) { - FaweUtil.copyFAWE(copyFrom, reference, newLocation); - - arenaCopy.getMainArena().getCopies().add(arenaCopy); - ArenaGUISetupManager.getInstance().getArenaSetupGUIs().get(arenaCopy.getMainArena()).get(GUIType.Arena_Copy).update(); - ArenaGUISetupManager.getInstance().getArenaSetupGUIs().get(arenaCopy.getMainArena()).get(GUIType.Arena_Main).update(); - GUIManager.getInstance().searchGUI(GUIType.Arena_Summary).update(); - } else { - this.copyNormal(profile, arenaCopy, copyFrom, reference, newLocation); - } - } - - @Override - public void deleteArena(final String arena, final Cuboid cuboid) { - if (SoftDependUtil.isFAWE_ENABLED) { - FaweUtil.deleteFAWE(cuboid); - } else { - deleteNormal(arena, cuboid); - } - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaUtil.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaUtil.java deleted file mode 100644 index f1d629c84..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ArenaUtil.java +++ /dev/null @@ -1,113 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import dev.nandi0813.practice.manager.arena.arenas.interfaces.BasicArena; -import dev.nandi0813.practice.manager.ladder.abstraction.Ladder; -import dev.nandi0813.practice.manager.ladder.abstraction.normal.NormalLadder; -import dev.nandi0813.practice.util.BasicItem; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.ArmorStand; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemStack; - -public class ArenaUtil implements dev.nandi0813.practice.module.interfaces.ArenaUtil { - - @Override - public boolean turnsToDirt(Block block) { - Material type = block.getType(); - return - type.equals(Material.GRASS_BLOCK) || - type.equals(Material.MYCELIUM) || - type.equals(Material.DIRT_PATH) || - type.equals(Material.FARMLAND) || - type.equals(Material.WARPED_NYLIUM); - } - - @Override - public boolean containsDestroyableBlock(Ladder ladder, Block block) { - if (!(ladder instanceof NormalLadder normalLadder)) return false; - - if (!ladder.isBuild()) return false; - if (normalLadder.getDestroyableBlocks().isEmpty()) return false; - if (block == null) return false; - - for (BasicItem basicItem : normalLadder.getDestroyableBlocks()) { - if (block.getType().equals(basicItem.getMaterial())) - return true; - } - return false; - } - - @Override - public boolean requiresSupport(Block block) { - Material type = block.getType(); - return org.bukkit.Tag.FLOWERS.isTagged(type) - || org.bukkit.Tag.SAPLINGS.isTagged(type) - || org.bukkit.Tag.CROPS.isTagged(type) - || org.bukkit.Tag.WALL_POST_OVERRIDE.isTagged(type) // torches, signs on walls, etc. - || type == Material.DEAD_BUSH - || type == Material.SHORT_GRASS - || type == Material.TALL_GRASS - || type == Material.FERN - || type == Material.LARGE_FERN - || type == Material.VINE - || type == Material.SUGAR_CANE - || type == Material.CACTUS - || type == Material.SNOW - || type == Material.TORCH - || type == Material.SOUL_TORCH - || type == Material.REDSTONE_WIRE - || type == Material.REDSTONE_TORCH - || type == Material.LEVER - || type == Material.COMPARATOR - || type == Material.REPEATER - || type == Material.TRIPWIRE_HOOK - || type == Material.TRIPWIRE - || type == Material.LILY_PAD - || type == Material.NETHER_WART; - } - - @Override - public void loadArenaChunks(BasicArena arena) { - if (arena.getCuboid() == null) return; - org.bukkit.World world = arena.getCuboid().getWorld(); - if (world == null) return; - - // Calculate chunk coordinate range directly from the cuboid bounds - // instead of calling getChunks() which synchronously loads all chunks. - int minCX = arena.getCuboid().getLowerX() >> 4; - int maxCX = arena.getCuboid().getUpperX() >> 4; - int minCZ = arena.getCuboid().getLowerZ() >> 4; - int maxCZ = arena.getCuboid().getUpperZ() >> 4; - - org.bukkit.plugin.Plugin plugin = dev.nandi0813.practice.ZonePractice.getInstance(); - for (int cx = minCX; cx <= maxCX; cx++) { - for (int cz = minCZ; cz <= maxCZ; cz++) { - // addPluginChunkTicket loads the chunk asynchronously if needed - // and prevents it from being unloaded — no main-thread stall. - world.addPluginChunkTicket(cx, cz, plugin); - } - } - } - - @Override - public void setArmorStandItemInHand(ArmorStand armorStand, ItemStack item, boolean rightHand) { - if (armorStand == null) return; - - if (rightHand) { - armorStand.setItem(EquipmentSlot.HAND, item); - } else { - armorStand.setItem(EquipmentSlot.OFF_HAND, item); - } - } - - @Override - public void setArmorStandInvulnerable(ArmorStand armorStand) { - if (armorStand == null) return; - armorStand.setInvulnerable(true); - // Make armor stands non-persistent so they don't survive server restarts - // This prevents orphaned armor stands (markers and holograms) from appearing after restart - armorStand.setPersistent(false); - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/BuildListener.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/BuildListener.java deleted file mode 100644 index d0ebc7a87..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/BuildListener.java +++ /dev/null @@ -1,86 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.module.interfaces.AbstractBuildListener; -import dev.nandi0813.practice.module.util.ClassImport; -import dev.nandi0813.practice.util.interfaces.Spectatable; -import org.bukkit.Location; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.event.EventHandler; -import org.bukkit.event.block.BlockExplodeEvent; -import org.bukkit.event.block.TNTPrimeEvent; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -public class BuildListener extends AbstractBuildListener { - - // ========================================================================= - // MODERN-ONLY: BlockExplodeEvent - // ========================================================================= - - @EventHandler - public void onBlockExplode(BlockExplodeEvent e) { - Spectatable spectatable = getByBlock(e.getBlock()); - handleExplosion(e, e.blockList(), spectatable); - } - - // ========================================================================= - // MODERN-ONLY: TNTPrimeEvent — fires BEFORE the block changes, giving us - // the accurate original material. Also records the custom fuse tick so - // onEntitySpawnEvent (in the base class) can apply it when the entity spawns. - // ========================================================================= - - private final Map setFuseTick = new HashMap<>(); - - private String locationKey(Location loc) { - return Objects.requireNonNull(loc.getWorld()).getName() - + ":" + loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); - } - - @EventHandler - public void onTntPrimeEvent(TNTPrimeEvent e) { - Spectatable spectatable = getByBlock(e.getBlock()); - if (spectatable == null) return; - - // Track the TNT block NOW — it is still TNT in the world at this point. - if (spectatable.isBuild()) { - spectatable.getFightChange().addArenaBlockChange(ClassImport.createChangeBlock(e.getBlock())); - } - - // Record custom fuse time for match contexts - if (spectatable instanceof Match match) { - if (!e.getCause().equals(TNTPrimeEvent.PrimeCause.EXPLOSION)) { - setFuseTick.put(locationKey(e.getBlock().getLocation()), - match.getLadder().getTntFuseTime() * 20); - } - } - } - - // ========================================================================= - // OVERRIDES - // ========================================================================= - - /** - * On modern Paper we already captured the TNT block via {@code TNTPrimeEvent}, - * so the base-class {@link #onEntitySpawnEvent} must not add a duplicate entry. - */ - @Override - protected boolean isTntBlockAlreadyTracked() { - return true; - } - - /** - * Apply the fuse time stored by {@link #onTntPrimeEvent} instead of the - * simple player-source check used by the 1.8.8 path. - */ - @Override - protected void onApplyFuseTime(TNTPrimed tnt, Match match) { - final String key = locationKey(tnt.getLocation()); - if (setFuseTick.containsKey(key)) { - tnt.setFuseTicks(setFuseTick.remove(key)); - } - } - -} \ No newline at end of file diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/EntityHider.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/EntityHider.java deleted file mode 100644 index 365fb6192..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/EntityHider.java +++ /dev/null @@ -1,33 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; - -public class EntityHider extends dev.nandi0813.practice.module.interfaces.EntityHider implements Listener { - - public EntityHider(Plugin plugin, Policy policy) { - super(plugin, policy); - } - - @Override - public void showEntity(Player observer, Entity entity) { - validate(observer, entity); - boolean hiddenBefore = !setVisibility(observer, entity.getEntityId(), true); - - // Resend packets - if (hiddenBefore) - observer.showEntity(plugin, entity); - } - - @Override - public void hideEntity(Player observer, Entity entity) { - validate(observer, entity); - boolean visibleBefore = setVisibility(observer, entity.getEntityId(), false); - - if (visibleBefore) - observer.hideEntity(plugin, entity); - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ItemCreateUtil.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ItemCreateUtil.java deleted file mode 100644 index 967f01bdb..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ItemCreateUtil.java +++ /dev/null @@ -1,139 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import dev.nandi0813.practice.util.StringUtil; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.List; - -public class ItemCreateUtil extends dev.nandi0813.practice.module.interfaces.ItemCreateUtil { - - @Override - public ItemStack createItem(String displayname, Material material, Short damage, int amount, List lore) { - ItemStack itemStack = new ItemStack(material, amount); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - itemMeta.setDisplayName(StringUtil.CC(displayname)); - itemMeta.setLore(StringUtil.CC(lore)); - - if (itemMeta instanceof Damageable) - ((Damageable) itemMeta).setDamage(damage); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - - @Override - public ItemStack createItem(String displayname, Material material) { - ItemStack itemStack = new ItemStack(material); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - itemMeta.setDisplayName(StringUtil.CC(displayname)); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - - @Override - public ItemStack createItem(Material material, Short damage) { - ItemStack itemStack = new ItemStack(material); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - if (itemMeta instanceof Damageable) - ((Damageable) itemMeta).setDamage(damage); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - - @Override - public ItemStack createItem(String displayname, Material material, Short damage) { - ItemStack itemStack = new ItemStack(material); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - itemMeta.setDisplayName(StringUtil.CC(displayname)); - - if (itemMeta instanceof Damageable) - ((Damageable) itemMeta).setDamage(damage); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - - @Override - public ItemStack createItem(String displayname, Material material, List lore) { - ItemStack itemStack = new ItemStack(material); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - itemMeta.setDisplayName(StringUtil.CC(displayname)); - itemMeta.setLore(StringUtil.CC(lore)); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - - @Override - public ItemStack createItem(String displayname, Material material, Short damage, List lore) { - ItemStack itemStack = new ItemStack(material); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - itemMeta.setDisplayName(StringUtil.CC(displayname)); - itemMeta.setLore(StringUtil.CC(lore)); - - if (itemMeta instanceof Damageable) - ((Damageable) itemMeta).setDamage(damage); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - - @Override - public ItemStack createItem(ItemStack item, List lore) { - ItemStack itemStack = new ItemStack(item); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - itemMeta.setLore(StringUtil.CC(lore)); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - - @Override - public ItemStack createItem(ItemStack item, String name, List lore) { - ItemStack itemStack = new ItemStack(item); - - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta != null) { - itemMeta.setDisplayName(StringUtil.CC(name)); - itemMeta.setLore(StringUtil.CC(lore)); - - hideItemFlags(itemMeta); - itemStack.setItemMeta(itemMeta); - } - return itemStack; - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ItemMaterialUtil.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ItemMaterialUtil.java deleted file mode 100644 index 34f79f719..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ItemMaterialUtil.java +++ /dev/null @@ -1,124 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.inventory.meta.SkullMeta; - -public class ItemMaterialUtil implements dev.nandi0813.practice.module.interfaces.ItemMaterialUtil { - @Override - public Material getSnowball() { - return Material.SNOWBALL; - } - - @Override - public Material getIronShovel() { - return Material.IRON_SHOVEL; - } - - @Override - public Material getEyeOfEnder() { - return Material.ENDER_EYE; - } - - @Override - public Material getRedBed() { - return Material.RED_BED; - } - - @Override - public Material getMushroomSoup() { - return Material.MUSHROOM_STEW; - } - - @Override - public Material getWater() { - return Material.WATER; - } - - @Override - public Material getLava() { - return Material.LAVA; - } - - @Override - public Material getFireball() { - return Material.FIRE_CHARGE; - } - - @Override - public Material getEndPortal() { - return Material.END_PORTAL; - } - - @Override - public Material getLilyPad() { - return Material.LILY_PAD; - } - - @Override - public Material getStainedClay() { - return Material.WHITE_TERRACOTTA; - } - - @Override - public Material getSplashPotion() { - return Material.SPLASH_POTION; - } - - @Override - public Material getGoldSword() { - return Material.GOLDEN_SWORD; - } - - @Override - public Material getClock() { - return Material.CLOCK; - } - - @Override - public EntityType getTNTMineCart() { - return EntityType.TNT_MINECART; - } - - @Override - public ItemStack getPlayerHead(OfflinePlayer player) { - ItemStack item = new ItemStack(Material.PLAYER_HEAD); - SkullMeta meta = (SkullMeta) item.getItemMeta(); - if (meta != null) - meta.setOwningPlayer(player); - item.setItemMeta(meta); - - return item; - } - - @Override - public ItemStack getSword() { - return new ItemStack(Material.DIAMOND_SWORD); - } - - @Override - public ItemStack getRedBlock() { - return new ItemStack(Material.RED_CONCRETE); - } - - @Override - public ItemStack getDefaultPlayerHead() { - // Return a default Steve head (no specific player) - return new ItemStack(Material.PLAYER_HEAD); - } - - @Override - public ItemStack getRedBoots() { - ItemStack boots = new ItemStack(Material.LEATHER_BOOTS); - LeatherArmorMeta meta = (LeatherArmorMeta) boots.getItemMeta(); - if (meta != null) { - meta.setColor(Color.RED); - boots.setItemMeta(meta); - } - return boots; - } -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/KitData.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/KitData.java deleted file mode 100644 index 503e77fbd..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/KitData.java +++ /dev/null @@ -1,45 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import org.bukkit.entity.Player; - -public class KitData extends dev.nandi0813.practice.module.interfaces.KitData { - - public KitData() { - super(); - } - - public KitData(dev.nandi0813.practice.module.interfaces.KitData kitData) { - super(kitData); - } - - @Override - public void setStorage(Player player) { - this.storage = player.getInventory().getStorageContents().clone(); - } - - @Override - public void setArmor(Player player) { - this.armor = player.getInventory().getArmorContents().clone(); - } - - @Override - public void setExtra(Player player) { - this.extra = player.getInventory().getExtraContents().clone(); - } - - @Override - public void loadStorage(Player player) { - player.getInventory().setContents(this.storage.clone()); - } - - @Override - public void loadArmor(Player player) { - player.getInventory().setArmorContents(this.armor.clone()); - } - - @Override - public void loadExtra(Player player) { - player.getInventory().setExtraContents(this.extra.clone()); - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/LadderUtil.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/LadderUtil.java deleted file mode 100644 index db38b26e2..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/LadderUtil.java +++ /dev/null @@ -1,158 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.ladder.type.FireballFight; -import dev.nandi0813.practice.util.Common; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.TextColor; -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.potion.PotionType; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -import static dev.nandi0813.practice.util.PermanentConfig.FIGHT_ENTITY; - -public class LadderUtil implements dev.nandi0813.practice.module.interfaces.LadderUtil { - - @Override - public void loadInventory(Player player, ItemStack[] armor, ItemStack[] inventory, ItemStack[] extra) { - player.getInventory().setArmorContents(armor); - player.getInventory().setStorageContents(inventory); - player.getInventory().setExtraContents(extra); - } - - private static final String[] MATERIAL_TYPES = { - "_WOOL", "_STAINED_CLAY", "_STAINED_GLASS", "_STAINED_GLASS_PANE", "_CARPET", - "_CONCRETE", "_CONCRETE_POWDER", "_TERRACOTTA", "_GLAZED_TERRACOTTA", "_CANDLE", "_BANNER" - }; - - public ItemStack changeItemColor(@NotNull ItemStack item, Component teamColor) { - String itemType = item.getType().toString(); - TextColor textColor = teamColor.color(); - Color color = Color.YELLOW; - if (textColor != null) { - color = Color.fromRGB( - Objects.requireNonNull(teamColor.color()).red(), - Objects.requireNonNull(teamColor.color()).green(), - Objects.requireNonNull(teamColor.color()).blue() - ); - } - - if (item.getType().name().startsWith("LEATHER_")) { - LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta(); - if (meta != null) { - meta.setColor(color); - item.setItemMeta(meta); - } - return item; - } - - for (String type : MATERIAL_TYPES) { - if (itemType.contains(type) && textColor != null) { - try { - Material material = Material.getMaterial(textColor.toString().toUpperCase() + type); - - if (material != null) { - return item.withType(material); - } - } catch (Exception ignored) { - break; - } - } - } - - return item; - } - - @Override - public ItemStack getPotionItem(String string) { - try { - if (string.contains("::")) { - String[] split = string.split("::"); - ItemStack itemStack = new ItemStack(Material.valueOf(split[0])); - - PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); - if (potionMeta != null) - potionMeta.setBasePotionType(PotionType.valueOf(split[1])); - - itemStack.setItemMeta(potionMeta); - return itemStack; - } - } catch (Exception e) { - Common.sendConsoleMMMessage("Invalid item: " + string); - } - return null; - } - - @Override - public boolean isUnbreakable(ItemStack item) { - if (item.hasItemMeta() && item.getItemMeta() != null) { - return item.getItemMeta().isUnbreakable(); - } - return false; - } - - @Override - public ItemMeta setUnbreakable(ItemMeta itemMeta, boolean unbreakable) { - if (itemMeta != null) { - itemMeta.setUnbreakable(unbreakable); - } - return itemMeta; - } - - @Override - public ItemStack setDurability(ItemStack itemStack, int durability) { - if (itemStack.getItemMeta() != null) { - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta instanceof Damageable damageable) { - int newDamage = itemStack.getType().getMaxDurability() - durability; - if (newDamage < 0 || newDamage > itemStack.getType().getMaxDurability()) { - newDamage = itemStack.getType().getMaxDurability(); - } - - damageable.setDamage(newDamage); - itemStack.setItemMeta(damageable); - return itemStack; - } - } - return itemStack; - } - - @Override - public void placeTnt(BlockPlaceEvent e, Match match) { - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - if (e.isCancelled()) { - return; - } - - Block block = e.getBlock(); - block.setType(Material.AIR); - block.getState().update(); - - TNTPrimed tnt = (TNTPrimed) block.getWorld().spawnEntity(block.getLocation().subtract(-0.5, 0, -0.5), EntityType.TNT); - tnt.setMetadata(FIGHT_ENTITY, new FixedMetadataValue(ZonePractice.getInstance(), match)); - tnt.setIsIncendiary(false); - - if (match.getLadder() instanceof FireballFight) { - tnt.setMetadata(FireballFight.FIREBALL_FIGHT_TNT, new FixedMetadataValue(ZonePractice.getInstance(), match)); - tnt.setMetadata(FireballFight.FIREBALL_FIGHT_TNT_SHOOTER, new FixedMetadataValue(ZonePractice.getInstance(), e.getPlayer())); - } - }, 2L); - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ModernConfigItemProvider.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ModernConfigItemProvider.java deleted file mode 100644 index 67d819f78..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ModernConfigItemProvider.java +++ /dev/null @@ -1,91 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import dev.nandi0813.practice.manager.gui.GUIItem; -import dev.nandi0813.practice.module.interfaces.ConfigItemProvider; -import dev.nandi0813.practice.util.Common; -import org.bukkit.Material; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemFlag; - -import java.util.List; - -public class ModernConfigItemProvider implements ConfigItemProvider { - - @Override - public GUIItem getGuiItem(YamlConfiguration config, String loc) { - GUIItem guiItem = new GUIItem(); - - if (config.isString(loc + ".NAME")) { - guiItem.setName(config.getString(loc + ".NAME")); - } - - if (config.isString(loc + ".MATERIAL")) { - guiItem.setMaterial(Material.valueOf(config.getString(loc + ".MATERIAL"))); - } - - if (config.isInt(loc + ".AMOUNT")) { - int amount = config.getInt(loc + ".AMOUNT"); - if (amount <= 0 || amount > 64) { - amount = 1; - } - guiItem.setAmount(amount); - } - - if (config.isInt(loc + ".DURABILITY")) { - int durability = config.getInt(loc + ".DURABILITY"); - if (durability < 0) { - durability = 1; - } - guiItem.setDurability(durability); - } - - if (config.isList(loc + ".LORE")) { - guiItem.setLore(config.getStringList(loc + ".LORE")); - } - - if (config.isList(loc + ".FLAGS")) { - List flags = config.getStringList(loc + ".FLAGS"); - for (String flag : flags) { - try { - ItemFlag itemFlag = ItemFlag.valueOf(flag); - guiItem.addItemFlag(itemFlag); - } catch (IllegalArgumentException e) { - Common.sendConsoleMMMessage("Invalid ItemFlag: " + flag); - } - } - } - - // Always add flags to hide unbreakable and attributes for clean lobby items - guiItem.addItemFlag(ItemFlag.HIDE_UNBREAKABLE); - guiItem.addItemFlag(ItemFlag.HIDE_ATTRIBUTES); - - // Set unbreakable to prevent durability bars from showing - guiItem.setUnbreakable(true); - - if (config.isList(loc + ".ENCHANTMENTS")) { - for (String s : config.getStringList(loc + ".ENCHANTMENTS")) { - String[] enchantmentSplit = s.split(":"); - if (enchantmentSplit.length != 2) { - continue; - } - - try { - Enchantment enchantment = Enchantment.getByName(enchantmentSplit[0]); - int level = Integer.parseInt(enchantmentSplit[1]); - - if (enchantment.getStartLevel() > level) { - level = enchantment.getStartLevel(); - } - - guiItem.addEnchantment(enchantment, level); - } catch (Exception e) { - Common.sendConsoleMMMessage("Enchantment not found: " + e); - } - } - } - - return guiItem; - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ModernItemCooldownHandler.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ModernItemCooldownHandler.java deleted file mode 100644 index 4d34ecda3..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/ModernItemCooldownHandler.java +++ /dev/null @@ -1,124 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.fight.util.FightPlayer; -import dev.nandi0813.practice.module.interfaces.ItemCooldownHandler; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; - -/** - * Modern (Paper) implementation of {@link ItemCooldownHandler}. - * - *

    Uses Paper's native {@link Player#setCooldown(Material, int)} / {@link Player#hasCooldown(Material)} - * exclusively — no runnables, no internal cooldown maps, no chat messages. - * - *

    Ender Pearl: duration is NOT set here. Paper fires {@code PlayerItemCooldownEvent} - * automatically after every pearl throw, and {@code EPCountdownListener.onEnderPearlCooldownSet} - * overrides the tick count to {@code duration * 20} in that event. This handler only - * blocks re-throws while {@code hasCooldown} is true. - * - *

    Golden Apple / Firework Rocket / Fireball: no vanilla cooldown is applied by the - * server, so we call {@code setCooldown} here directly when the action is first performed. - */ -public class ModernItemCooldownHandler implements ItemCooldownHandler { - - // ------------------------------------------------------------------------- - // Ender Pearl — duration controlled by PlayerItemCooldownEvent in EPCountdownListener - // ------------------------------------------------------------------------- - - @Override - public void handleEnderPearlFFA(Player player, FightPlayer fightPlayer, int duration, boolean expBar, - Cancellable event, String langKey) { - if (player.hasCooldown(Material.ENDER_PEARL)) { - if (event != null) { - event.setCancelled(true); - } - } - // If no cooldown: let the throw proceed; PlayerItemCooldownEvent will set the correct duration. - } - - @Override - public void handleEnderPearlMatch(Player player, FightPlayer fightPlayer, int duration, boolean expBar, - Cancellable event, String langKey) { - if (player.hasCooldown(Material.ENDER_PEARL)) { - if (event != null) { - event.setCancelled(true); - } - } - // If no cooldown: let the throw proceed; PlayerItemCooldownEvent will set the correct duration. - } - - // ------------------------------------------------------------------------- - // Golden Apple - // ------------------------------------------------------------------------- - - @Override - public void handleGoldenAppleFFA(Player player, int duration, Cancellable event, String langKey) { - if (player.hasCooldown(Material.GOLDEN_APPLE)) { - if (event != null) { - event.setCancelled(true); - } - } else { - player.setCooldown(Material.GOLDEN_APPLE, duration * 20); - } - } - - @Override - public void handleGoldenAppleMatch(Player player, int duration, Cancellable event, String langKey) { - if (player.hasCooldown(Material.GOLDEN_APPLE)) { - if (event != null) { - event.setCancelled(true); - } - } else { - player.setCooldown(Material.GOLDEN_APPLE, duration * 20); - } - } - - // ------------------------------------------------------------------------- - // Firework Rocket - // ------------------------------------------------------------------------- - - @Override - public void handleFireworkRocketFFA(Player player, FightPlayer fightPlayer, int duration, - Cancellable event, String langKey) { - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - if (player.hasCooldown(Material.FIREWORK_ROCKET)) { - if (event != null) { - event.setCancelled(true); - } - } else { - player.setCooldown(Material.FIREWORK_ROCKET, duration * 20); - } - }, 2L); - } - - @Override - public void handleFireworkRocketMatch(Player player, FightPlayer fightPlayer, int duration, - Cancellable event, String langKey) { - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - if (player.hasCooldown(Material.FIREWORK_ROCKET)) { - if (event != null) { - event.setCancelled(true); - } - } else { - player.setCooldown(Material.FIREWORK_ROCKET, duration * 20); - } - }, 2L); - } - - // ------------------------------------------------------------------------- - // Fireball - // ------------------------------------------------------------------------- - - @Override - public boolean handleFireballMatch(Player player, double duration, String langKey) { - if (player.hasCooldown(Material.FIRE_CHARGE)) { - return false; - } else { - player.setCooldown(Material.FIRE_CHARGE, (int) (duration * 20)); - return true; - } - } -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/PlayerHiderUtil.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/PlayerHiderUtil.java deleted file mode 100644 index 81d11b795..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/PlayerHiderUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerInfoUpdate; -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.module.interfaces.PlayerHiderInterface; -import org.bukkit.entity.Player; - -public class PlayerHiderUtil implements PlayerHiderInterface { - - @Override - public void hidePlayer(Player observer, Player target, boolean fullHide) { - if (observer.canSee(target)) - observer.hidePlayer(ZonePractice.getInstance(), target); - - if (!fullHide) { - WrapperPlayServerPlayerInfoUpdate playerInfoUpdate = new WrapperPlayServerPlayerInfoUpdate( - WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_LISTED, - new WrapperPlayServerPlayerInfoUpdate.PlayerInfo(target.getUniqueId()) - ); - - PacketEvents.getAPI().getPlayerManager().sendPacket(observer, playerInfoUpdate); - } - } - - @Override - public void showPlayer(Player observer, Player target) { - observer.showPlayer(ZonePractice.getInstance(), target); - } - -} - diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/WorldCreate.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/WorldCreate.java deleted file mode 100644 index 49d04feac..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/interfaces/WorldCreate.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.nandi0813.practice_modern.interfaces; - -import org.bukkit.World; -import org.bukkit.WorldCreator; -import org.bukkit.WorldType; - -public class WorldCreate implements dev.nandi0813.practice.module.interfaces.WorldCreate { - - @Override - public World createEmptyWorld(String worldName) { - WorldCreator wc = new WorldCreator(worldName); - wc.type(WorldType.FLAT); - wc.generateStructures(false); - wc.generatorSettings("{\"layers\": [{\"block\": \"air\", \"height\": 1}, {\"block\": \"air\", \"height\": 1}], \"biome\":\"plains\"}"); - return wc.createWorld(); - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/ArenaListener.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/ArenaListener.java deleted file mode 100644 index 797a489a3..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/ArenaListener.java +++ /dev/null @@ -1,45 +0,0 @@ -package dev.nandi0813.practice_modern.listener; - -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.arena.util.ArenaWorldUtil; -import dev.nandi0813.practice.manager.server.ServerManager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.ChunkUnloadEvent; -import org.bukkit.event.world.WorldUnloadEvent; - -import static dev.nandi0813.practice.manager.arena.ArenaManager.LOADED_CHUNKS; -import static dev.nandi0813.practice.manager.arena.ArenaManager.LOAD_CHUNKS; - -public class ArenaListener implements Listener { - - @EventHandler - public void onChunkUnload(ChunkUnloadEvent e) { - if (LOAD_CHUNKS) { - if (LOADED_CHUNKS.contains(e.getChunk())) { - // Use addPluginChunkTicket to force-keep the chunk loaded. - // This is safe from recursion (unlike getChunkAtAsync which can - // trigger chunk scheduling → more unloads → StackOverflowError). - e.getChunk().addPluginChunkTicket(ZonePractice.getInstance()); - } - } - } - - @EventHandler - public void onWorldUnload(WorldUnloadEvent e) { - if (e.getWorld() == ArenaWorldUtil.getArenasWorld()) { - e.setCancelled(true); - return; - } - - if (e.getWorld() == ArenaWorldUtil.getArenasCopyWorld()) { - e.setCancelled(true); - return; - } - - if (ServerManager.getLobby() != null && ServerManager.getLobby().getWorld() == e.getWorld()) { - e.setCancelled(true); - } - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FFAListener.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FFAListener.java deleted file mode 100644 index 195d26ae4..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FFAListener.java +++ /dev/null @@ -1,72 +0,0 @@ -package dev.nandi0813.practice_modern.listener; - -import dev.nandi0813.practice.manager.fight.ffa.FFAManager; -import dev.nandi0813.practice.manager.fight.ffa.game.FFA; -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import dev.nandi0813.practice.manager.fight.util.FightUtil; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import org.bukkit.damage.DamageSource; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.PlayerDeathEvent; - -public class FFAListener extends dev.nandi0813.practice.manager.fight.ffa.FFAListener { - - @EventHandler - public void onPlayerDeath(PlayerDeathEvent e) { - Player player = e.getPlayer(); - - Profile profile = ProfileManager.getInstance().getProfile(player); - if (profile == null) return; - - FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); - if (ffa == null) return; - - e.setCancelled(true); - - DamageSource damageSource = e.getDamageSource(); - Player killer = null; - if (damageSource.getCausingEntity() instanceof Entity damageEntity) { - killer = FightUtil.getKiller(damageEntity); - } - - DeathCause cause = dev.nandi0813.practice_modern.listener.FightUtil.convert(damageSource.getDamageType()); - ffa.killPlayer(player, killer, cause.getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")); - - if (killer != null) { - Statistic statistic = ffa.getStatistics().get(killer); - statistic.setKills(statistic.getKills() + 1); - } - } - - @EventHandler - public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { - if (!(e.getEntity() instanceof Player player)) { - return; - } - - Profile profile = ProfileManager.getInstance().getProfile(player); - if (profile == null) return; - - FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); - if (ffa == null) return; - - if (!(e.getEntity() instanceof Player target)) return; - - if (e.getDamager() instanceof Projectile projectile) { - if (projectile.getShooter() instanceof Player attacker) { - - if (projectile instanceof Arrow) { - arrowDisplayHearth(attacker, target, e.getFinalDamage()); - } - } - } - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FightUtil.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FightUtil.java deleted file mode 100644 index ebc0cfbbf..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/FightUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -package dev.nandi0813.practice_modern.listener; - -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import org.bukkit.damage.DamageType; - -public enum FightUtil { - ; - - public static DeathCause convert(DamageType damageType) { - if (damageType == null) { - return DeathCause.DEFAULT; - } - - if (damageType.equals(DamageType.IN_FIRE) || damageType.equals(DamageType.ON_FIRE) || - damageType.equals(DamageType.CAMPFIRE) || damageType.equals(DamageType.HOT_FLOOR)) { - return DeathCause.FIRE; - } else if (damageType.equals(DamageType.LAVA)) { - return DeathCause.LAVA; - } else if (damageType.equals(DamageType.DROWN)) { - return DeathCause.WATER; - } else if (damageType.equals(DamageType.FALL) || damageType.equals(DamageType.STALAGMITE)) { - return DeathCause.FALL; - } else if (damageType.equals(DamageType.EXPLOSION) || damageType.equals(DamageType.PLAYER_EXPLOSION)) { - return DeathCause.EXPLOSION; - } else if (damageType.equals(DamageType.MOB_ATTACK) || damageType.equals(DamageType.PLAYER_ATTACK)) { - return DeathCause.PLAYER_ATTACK; - } else if (damageType.equals(DamageType.ARROW) || damageType.equals(DamageType.TRIDENT) || - damageType.equals(DamageType.MOB_PROJECTILE)) { - return DeathCause.PLAYER_PROJECTILE; - } else if (damageType.equals(DamageType.OUT_OF_WORLD)) { - return DeathCause.VOID; - } else { - return DeathCause.DEFAULT; - } - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/MatchListener.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/MatchListener.java deleted file mode 100644 index 5b3c2c45f..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/listener/MatchListener.java +++ /dev/null @@ -1,245 +0,0 @@ -package dev.nandi0813.practice_modern.listener; - -import com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent; -import dev.nandi0813.practice.ZonePractice; -import dev.nandi0813.practice.manager.backend.LanguageManager; -import dev.nandi0813.practice.manager.fight.event.EventManager; -import dev.nandi0813.practice.manager.fight.event.events.duel.brackets.Brackets; -import dev.nandi0813.practice.manager.fight.event.interfaces.Event; -import dev.nandi0813.practice.manager.fight.match.Match; -import dev.nandi0813.practice.manager.fight.match.MatchManager; -import dev.nandi0813.practice.manager.fight.match.enums.RoundStatus; -import dev.nandi0813.practice.manager.fight.match.listener.LadderTypeListener; -import dev.nandi0813.practice.manager.fight.match.util.KnockbackUtil; -import dev.nandi0813.practice.manager.fight.match.util.MatchFightPlayer; -import dev.nandi0813.practice.manager.fight.match.util.TeamUtil; -import dev.nandi0813.practice.manager.fight.util.DeathCause; -import dev.nandi0813.practice.manager.fight.util.FightUtil; -import dev.nandi0813.practice.manager.fight.util.ListenerUtil; -import dev.nandi0813.practice.manager.fight.util.Stats.Statistic; -import dev.nandi0813.practice.manager.ladder.abstraction.interfaces.LadderHandle; -import dev.nandi0813.practice.manager.ladder.enums.KnockbackType; -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import dev.nandi0813.practice.manager.profile.enums.ProfileStatus; -import dev.nandi0813.practice.manager.spectator.SpectatorManager; -import dev.nandi0813.practice.util.Common; -import org.bukkit.Bukkit; -import org.bukkit.damage.DamageSource; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.*; -import org.bukkit.event.inventory.InventoryAction; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.PlayerSwapHandItemsEvent; - -public class MatchListener extends LadderTypeListener implements Listener { - - @EventHandler - public void onPlayerDamage(EntityDamageEvent e) { - if (!(e.getEntity() instanceof Player player)) return; - - Profile profile = ProfileManager.getInstance().getProfile(player); - if (profile == null) return; - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match == null) return; - - if (ListenerUtil.cancelEvent(match, player)) { - e.setDamage(0); - e.setCancelled(true); - return; - } - - if (e instanceof EntityDamageByEntityEvent) { - onEntityDamageByEntity((EntityDamageByEntityEvent) e); - } - - if (match.getLadder() instanceof LadderHandle ladderHandle) { - ladderHandle.handleEvents(e, match); - } - } - - @EventHandler - public void onPlayerDeath(PlayerDeathEvent e) { - Player player = e.getEntity(); - - Profile profile = ProfileManager.getInstance().getProfile(player); - if (profile == null) return; - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match == null) return; - - e.setCancelled(true); - - DamageSource damageSource = e.getDamageSource(); - Player killer; - if (damageSource.getCausingEntity() instanceof Entity damageEntity) { - killer = FightUtil.getKiller(damageEntity); - } else { - killer = null; - } - - DeathCause cause = dev.nandi0813.practice_modern.listener.FightUtil.convert(damageSource.getDamageType()); - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> - match.killPlayer(player, killer, cause.getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")), 1L); - - if (killer != null) { - Statistic statistic = match.getCurrentStat(killer); - statistic.setKills(statistic.getKills() + 1); - } - } - - private static void onEntityDamageByEntity(EntityDamageByEntityEvent e) { - if (!(e.getEntity() instanceof Player target)) return; - - Player attacker = null; - if (e.getDamager() instanceof Player) { - attacker = (Player) e.getDamager(); - } else if (e.getDamager() instanceof Projectile projectile) { - if (projectile.getShooter() instanceof Player) { - attacker = (Player) projectile.getShooter(); - - if (projectile instanceof Arrow) { - arrowDisplayHearth(attacker, target, e.getFinalDamage()); - } - } - } - - if (attacker == null) return; - - Profile attackerProfile = ProfileManager.getInstance().getProfile(attacker); - Profile targetProfile = ProfileManager.getInstance().getProfile(target); - - if (!attackerProfile.getStatus().equals(ProfileStatus.MATCH)) return; - if (!targetProfile.getStatus().equals(ProfileStatus.MATCH)) return; - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(attacker); - if (match != MatchManager.getInstance().getLiveMatchByPlayer(target)) { - e.setCancelled(true); - return; - } - - if (!match.getCurrentRound().getRoundStatus().equals(RoundStatus.LIVE)) return; - - boolean cancel = match.getCurrentStat(attacker).isSet() || match.getCurrentStat(target).isSet(); - - if (!cancel) { - cancel = TeamUtil.isSaveTeamMate(match, attacker, target); - } - - if (cancel) { - e.setCancelled(true); - return; - } else { - if (match.getLadder() instanceof LadderHandle ladderHandle) { - ladderHandle.handleEvents(e, match); - } - } - - // Always record the attacker for void-kill attribution, - // regardless of whether the event was cancelled by a ladder handler. - match.recordAttack(target, attacker); - - if (!e.isCancelled() && !match.getLadder().getLadderKnockback().getKnockbackType().equals(KnockbackType.DEFAULT)) { - KnockbackUtil.setPlayerKnockback(target, match.getLadder().getLadderKnockback().getKnockbackType()); - } - } - - @EventHandler - public void onExpPickup(PlayerPickupExperienceEvent e) { - Player player = e.getPlayer(); - - if (SpectatorManager.getInstance().getSpectators().containsKey(player)) { - e.setCancelled(true); - } - } - - @EventHandler - public void onEntityTarget(EntityTargetEvent e) { - if (!(e.getTarget() instanceof Player player)) { - return; - } - - if (SpectatorManager.getInstance().getSpectators().containsKey(player)) { - e.setCancelled(true); - } - } - - /** - * Prevents players from swapping items in their hands before they have chosen a kit. - */ - @EventHandler - public void onPlayerSwapHandItemsEvent(PlayerSwapHandItemsEvent e) { - Player player = e.getPlayer(); - Profile profile = ProfileManager.getInstance().getProfile(player); - - if (profile.getStatus() == ProfileStatus.MATCH) { - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match != null) { - MatchFightPlayer matchFightPlayer = match.getMatchPlayers().get(player); - if (!matchFightPlayer.isHasChosenKit()) { - e.setCancelled(true); - } - } - } - } - - /** - * Prevents players from swapping items in their hands before they have chosen a kit. - * Or when they are in the kit editor. - */ - @EventHandler - public void onInventoryClick(InventoryClickEvent e) { - if (!(e.getWhoClicked() instanceof Player player)) { - return; - } - Profile profile = ProfileManager.getInstance().getProfile(player); - - if (e.getAction().equals(InventoryAction.HOTBAR_SWAP)) { - switch (profile.getStatus()) { - case MATCH -> { - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match != null) { - MatchFightPlayer matchFightPlayer = match.getMatchPlayers().get(player); - if (!matchFightPlayer.isHasChosenKit()) { - e.setCancelled(true); - } - } - } - case EDITOR -> e.setCancelled(true); - } - } - } - - @EventHandler - public void onWindCharge(ProjectileLaunchEvent e) { - if (!(e.getEntity() instanceof WindCharge)) { - return; - } - - if (!(e.getEntity().getShooter() instanceof Player player)) { - return; - } - - Profile profile = ProfileManager.getInstance().getProfile(player); - switch (profile.getStatus()) { - case MATCH -> { - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match != null && !match.getLadder().isBuild()) { - Common.sendMMMessage(player, LanguageManager.getString("MATCH.ONLY-CHARGE-WIND")); - e.setCancelled(true); - } - } - case EVENT -> { - Event event = EventManager.getInstance().getEventByPlayer(player); - if (event instanceof Brackets) { - Common.sendMMMessage(player, LanguageManager.getString("MATCH.ONLY-CHARGE-WIND")); - e.setCancelled(true); - } - } - } - } - -} diff --git a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/modern_version/ItemOffHand.java b/spigot_modern/src/main/java/dev/nandi0813/practice_modern/modern_version/ItemOffHand.java deleted file mode 100644 index 49d27981d..000000000 --- a/spigot_modern/src/main/java/dev/nandi0813/practice_modern/modern_version/ItemOffHand.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.nandi0813.practice_modern.modern_version; - -import dev.nandi0813.practice.manager.profile.Profile; -import dev.nandi0813.practice.manager.profile.ProfileManager; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerSwapHandItemsEvent; - -public class ItemOffHand implements Listener { - - @EventHandler - public void onItemSwitchHand(PlayerSwapHandItemsEvent e) { - Player player = e.getPlayer(); - if (player.isOp() || player.hasPermission("*")) return; - - Profile profile = ProfileManager.getInstance().getProfile(player); - - if (profile == null) return; - - switch (profile.getStatus()) { - case LOBBY, QUEUE, EDITOR, SPECTATE -> e.setCancelled(true); - } - } - -}