diff --git a/core/src/main/java/dev/nandi0813/practice/command/singlecommands/AcceptCommand.java b/core/src/main/java/dev/nandi0813/practice/command/singlecommands/AcceptCommand.java index d3d21265a..04d386d68 100644 --- a/core/src/main/java/dev/nandi0813/practice/command/singlecommands/AcceptCommand.java +++ b/core/src/main/java/dev/nandi0813/practice/command/singlecommands/AcceptCommand.java @@ -91,6 +91,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String SpectatorManager.getInstance().getSpectators().get(player).removeSpectator(player); } + // Update sender reference to the current online Player instance + // in case the original sender disconnected and rejoined since the request was sent. + request.setSender(target); request.acceptRequest(); } else Common.sendMMMessage(player, LanguageManager.getString("command.accept.player-not-available").replace("%target%", target.getName())); 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 3bcdd2ced..eb5c4a5dc 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 @@ -16,7 +16,6 @@ import dev.nandi0813.practice.util.Cuboid; import dev.nandi0813.practice.util.NumberUtil; import dev.nandi0813.practice.util.fightmapchange.FightChangeOptimized; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.damage.DamageSource; @@ -198,8 +197,6 @@ protected static void arrowDisplayHearth(Player shooter, Player target, double f .replace("%health%", String.valueOf(health))); } - private static final String FFA_DEATH_ANIMATION_ENABLED_PATH = "FFA.DEATH-ANIMATION.ENABLED"; - private static final boolean ALLOW_DESTROYABLE_BLOCK = ConfigManager.getBoolean("FFA.ALLOW-DESTROYABLE-BLOCK"); /** @@ -379,10 +376,7 @@ public void onPlayerDeath(PlayerDeathEvent e) { e.setDroppedExp(0); e.setKeepInventory(true); e.setKeepLevel(true); - e.setDeathMessage(null); - - boolean playVanillaDeathAnimation = ConfigManager.getConfig().getBoolean(FFA_DEATH_ANIMATION_ENABLED_PATH, true); - e.setCancelled(!playVanillaDeathAnimation); + e.setCancelled(true); DamageSource damageSource = e.getDamageSource(); @@ -398,43 +392,17 @@ public void onPlayerDeath(PlayerDeathEvent e) { if (cause == DeathCause.EXPLOSION && killer != null && !killer.equals(player)) { cause = DeathCause.EXPLOSION_BY_PLAYER; } + ffa.killPlayer(player, killer, cause.getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")); - Player finalKiller = killer; - DeathCause finalCause = cause; - - Runnable deathTask = () -> { - if (playVanillaDeathAnimation && player.isOnline() && player.isDead()) { - player.spigot().respawn(); - } - ffa.killPlayer(player, finalKiller, finalCause.getMessage().replace("%killer%", finalKiller != null ? finalKiller.getName() : "Unknown")); - - if (finalKiller != null && !finalKiller.equals(player)) { - Statistic statistic = ffa.getStatistics().computeIfAbsent( - finalKiller, - p -> new Statistic(ProfileManager.getInstance().getUuids().get(p)) - ); - statistic.setKills(statistic.getKills() + 1); - } - }; - - if (playVanillaDeathAnimation) { - long delayTicks = 15L; - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), deathTask, delayTicks); - } else { - deathTask.run(); + if (killer != null && !killer.equals(player)) { + Statistic statistic = ffa.getStatistics().computeIfAbsent( + killer, + p -> new Statistic(ProfileManager.getInstance().getUuids().get(p)) + ); + statistic.setKills(statistic.getKills() + 1); } } - @EventHandler - public void onFFARespawn(PlayerRespawnEvent e) { - Player player = e.getPlayer(); - - FFA ffa = FFAManager.getInstance().getFFAByPlayer(player); - if (ffa == null) return; - - e.setRespawnLocation(player.getLocation()); - } - private Player resolveKiller(Player victim, FFA ffa, DamageSource damageSource) { Player killer = null; 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 7b5f05727..675d05c1f 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 @@ -14,7 +14,6 @@ import dev.nandi0813.practice.manager.fight.match.runnable.game.BridgeArrowRunnable; 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; @@ -51,6 +50,7 @@ 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 class LadderTypeListener implements Listener { @@ -59,7 +59,6 @@ public class LadderTypeListener implements Listener { private static final String SHIELD_STUN_DURATION_PATH = AXE_LADDER_SETTINGS_PATH + ".SHIELD-STUN.DURATION-TICKS"; private static final String SHIELD_STUN_REQUIRE_AXE_PATH = AXE_LADDER_SETTINGS_PATH + ".SHIELD-STUN.REQUIRE-AXE"; private static final String SHIELD_SKIP_VANILLA_TICK_PATH = AXE_LADDER_SETTINGS_PATH + ".SKIP-VANILLA-DAMAGE-TICK-WHEN-SHIELD-BLOCKED"; - private static final String DEATH_ANIMATION_ENABLED_PATH = "MATCH-SETTINGS.DEATH-ANIMATION.ENABLED"; private static final int SKYWARS_KILLER_EXP_LEVEL_REWARD = 5; private static final int SKYWARS_ENCHANT_LAPIS_AMOUNT = 3; @@ -196,6 +195,7 @@ private static void enforceShieldDamageTickBypass(Player target) { // Run one tick later so vanilla cannot restore the damage immunity window. Bukkit.getScheduler().runTask(ZonePractice.getInstance(), () -> { if (!target.isOnline() || target.isDead()) { + return; } }); } @@ -680,10 +680,7 @@ public void onPlayerDeath(PlayerDeathEvent e) { e.setDroppedExp(0); e.setKeepInventory(true); e.setKeepLevel(true); - e.deathMessage(null); - - boolean playVanillaDeathAnimation = ConfigManager.getConfig().getBoolean(DEATH_ANIMATION_ENABLED_PATH, true); - e.setCancelled(!playVanillaDeathAnimation); + e.setCancelled(true); DamageSource damageSource = e.getDamageSource(); Player killer; @@ -694,18 +691,8 @@ public void onPlayerDeath(PlayerDeathEvent e) { } DeathCause cause = FightUtil.convert(damageSource.getDamageType()); - if (cause == DeathCause.EXPLOSION && killer != null && !killer.equals(player)) { - cause = DeathCause.EXPLOSION_BY_PLAYER; - } - DeathCause finalCause = cause; - - long delayTicks = playVanillaDeathAnimation ? 15L : 1L; - Bukkit.getScheduler().runTaskLater(ZonePractice.getInstance(), () -> { - if (playVanillaDeathAnimation && player.isOnline() && player.isDead()) { - player.spigot().respawn(); - } - match.killPlayer(player, killer, finalCause.getMessage().replace("%killer%", killer != null ? killer.getName() : "Unknown")); - }, delayTicks); + 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); @@ -719,16 +706,6 @@ public void onPlayerDeath(PlayerDeathEvent e) { } } - @EventHandler - public void onMatchRespawn(PlayerRespawnEvent e) { - Player player = e.getPlayer(); - - Match match = MatchManager.getInstance().getLiveMatchByPlayer(player); - if (match == null) return; - - e.setRespawnLocation(player.getLocation()); - } - private static void onEntityDamageByEntity(EntityDamageByEntityEvent e) { if (!(e.getEntity() instanceof Player target)) return; 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 7aaed089b..182049459 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 @@ -2,6 +2,7 @@ import dev.nandi0813.practice.manager.fight.match.Match; import dev.nandi0813.practice.manager.fight.match.MatchManager; +import dev.nandi0813.practice.manager.fight.match.enums.MatchStatus; 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; @@ -59,6 +60,9 @@ public void onPlayerTeleport(PlayerTeleportEvent e) { Match match = MatchManager.getInstance().getLiveMatchByPlayer(e.getPlayer()); if (match == null) return; + if (match.getStatus().equals(MatchStatus.END) || match.getStatus().equals(MatchStatus.OVER)) + return; + if (!match.getArena().getCuboid().contains(e.getTo())) e.setCancelled(true); } 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 0e4431eb9..b5f520d30 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 @@ -391,6 +391,10 @@ private void placeQuickMatchItem(Inventory inventory, ItemStack filler, int actu private void placeCategorySelectors(Inventory inventory, CategoryConfig currentCategory, List allCategories, int actualSize, String guiPath) { for (CategoryConfig category : allCategories) { + if (category.iconDisabled()) { + continue; + } + int selectorSlot = category.selectorSlot(); if (selectorSlot < 0 || selectorSlot >= actualSize) { continue; @@ -690,6 +694,7 @@ private List loadCategories(String queuePath) { String iconMaterial = ConfigManager.getString(categoryPath + ".ICON-MATERIAL"); String selectedIconMaterial = ConfigManager.getString(categoryPath + ".SELECTED-ICON-MATERIAL"); + boolean iconDisabled = ConfigManager.getBoolean(categoryPath + ".ICON-DISABLED"); categories.add(new CategoryConfig( categoryKey, @@ -698,7 +703,8 @@ private List loadCategories(String queuePath) { iconMaterial, selectedIconMaterial, ladders, - new ArrayList<>(ladderSlots) + new ArrayList<>(ladderSlots), + iconDisabled )); } @@ -769,7 +775,8 @@ private NormalLadder getRandomQuickMatchLadder(Map ladder private record CategoryConfig(String key, String displayName, int selectorSlot, String iconMaterial, String selectedIconMaterial, - List ladderNames, List ladderSlots) { + List ladderNames, List ladderSlots, + boolean iconDisabled) { } /** * Replaces %in_queue% and %in_fight% in a Component using Adventure's 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 aecf478fa..3cbbc05bb 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 @@ -89,15 +89,11 @@ protected Hologram(String name, HologramType hologramType) { } } - // ABSTRACT METHODS - public abstract void getAbstractData(YamlConfiguration config); public abstract void setAbstractData(YamlConfiguration config); public abstract boolean isReadyToEnable(); public abstract Leaderboard getNextLeaderboard(); - // DATA PERSISTENCE - public void getData() { enabled = config.getBoolean("holograms." + name + ".enabled", false); @@ -143,8 +139,6 @@ public void moveTo(@NotNull Location location) { this.baseLocation = location.clone().subtract(0, 2, 0); } - // CORE MANAGEMENT - /** * Despawns all hologram lines and clears state. */ @@ -236,8 +230,6 @@ else if (textLines.size() < lines.size()) { } } - // UPDATE LOGIC - /** * Main update method - handles leaderboard changes and content updates. */ @@ -291,8 +283,6 @@ private void handleEmptyLeaderboard() { } } - // TEXT BUILDING - private List buildTextLines(@NotNull Leaderboard leaderboard) { List configLines = getConfigLines(leaderboard); @@ -385,8 +375,6 @@ private String formatPlayerEntry(OfflinePlayer player, MapLadder Effects" MATERIAL: POTION DAMAGE: 8233 + FLAGS: + - HIDE_POTION_EFFECTS LORE: - "------------------------" - "This ladder has no effects." @@ -1071,6 +1073,8 @@ GUIS: NAME: "Ladder Effects" MATERIAL: POTION DAMAGE: 8233 + FLAGS: + - HIDE_POTION_EFFECTS LORE: - "------------------------" - "You will get these effects,"