From 64e50b1e392681c3dbef1554215fa0f47b66c17a Mon Sep 17 00:00:00 2001 From: Marcel <8513034+MrEAlderson@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:33:25 +0200 Subject: [PATCH 1/2] Chest locking: Added config to configure locked materials --- .../me/metallicgoat/tweaksaddon/config/MainConfig.java | 9 +++++++-- .../tweaksaddon/tweaks/misc/LockTeamChest.java | 10 +++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java b/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java index d6538d4..033ddf4 100644 --- a/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java +++ b/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java @@ -8,7 +8,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Set; import lombok.Getter; import me.metallicgoat.tweaksaddon.config.ConfigManager.Config; import me.metallicgoat.tweaksaddon.config.ConfigManager.SectionTitle; @@ -324,11 +326,14 @@ public class MainConfig { @Config( description = { - "Prevents player from opening a bases' chest if bases team is still alive", - "Note: You may want to disable team chests in MBedwars, as it works like a shared team Ender Chest" + "Prevents player from opening an enemies' base chest if its team is still alive (has players)", + "Materials is a list of chest types to lock, you may use CHEST or ENDER_CHEST", + "Note: In case you want to lock ENDER_CHEST, make sure it's configured as a team chest within MBedwars' config.yml", + "Range is the radius around a team's spawn point in which the chest shall get locked" } ) public static boolean lock_team_chest_enabled = true; + public static Set lock_team_chest_materials = new HashSet<>(Arrays.asList(Material.CHEST)); @Config public static double lock_team_chest_range = 8; @Config public static String lock_team_chest_fail_open = "&cYou cannot open this chest until {team} &chas been eliminated."; diff --git a/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java b/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java index c76d082..05d58af 100644 --- a/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java +++ b/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java @@ -7,7 +7,6 @@ import de.marcely.bedwars.tools.location.XYZYP; import me.metallicgoat.tweaksaddon.config.MainConfig; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -18,17 +17,18 @@ public class LockTeamChest implements Listener { // Many people will want team chests disabled, use this with only regular chests @EventHandler public void playerOpenArenaChest(PlayerOpenArenaChestEvent event) { + if (!MainConfig.lock_team_chest_enabled) + return; - // THIS IS NOT FOR MBEDWARS TEAM CHESTS - final boolean isStandardChest = !event.isTeamChest() && event.getChestBlock().getType() == Material.CHEST; + final Block block = event.getChestBlock(); - if (!MainConfig.lock_team_chest_enabled || !isStandardChest) + if (!MainConfig.lock_team_chest_materials.contains(block.getType())) return; final Arena arena = event.getArena(); final Player player = event.getPlayer(); final Team playerTeam = event.getTeam(); - final Team chestTeam = getChestTeam(arena, event.getChestBlock()); + final Team chestTeam = getChestTeam(arena, block); if (chestTeam != null && !arena.getPlayersInTeam(chestTeam).isEmpty() && chestTeam != playerTeam) { Message.build(MainConfig.lock_team_chest_fail_open) From 26226f40f58313162b430fa3882e61b5996be57f Mon Sep 17 00:00:00 2001 From: Marcel <8513034+MrEAlderson@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:15:23 +0100 Subject: [PATCH 2/2] Chest locking: Fixed not working if team chests are configured wrong --- .../tweaksaddon/config/MainConfig.java | 2 +- .../tweaks/misc/LockTeamChest.java | 41 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java b/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java index 033ddf4..d7d5356 100644 --- a/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java +++ b/src/main/java/me/metallicgoat/tweaksaddon/config/MainConfig.java @@ -333,7 +333,7 @@ public class MainConfig { } ) public static boolean lock_team_chest_enabled = true; - public static Set lock_team_chest_materials = new HashSet<>(Arrays.asList(Material.CHEST)); + @Config public static Set lock_team_chest_materials = new HashSet<>(Arrays.asList(Material.CHEST)); @Config public static double lock_team_chest_range = 8; @Config public static String lock_team_chest_fail_open = "&cYou cannot open this chest until {team} &chas been eliminated."; diff --git a/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java b/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java index 05d58af..c0f3cdf 100644 --- a/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java +++ b/src/main/java/me/metallicgoat/tweaksaddon/tweaks/misc/LockTeamChest.java @@ -1,6 +1,8 @@ package me.metallicgoat.tweaksaddon.tweaks.misc; +import de.marcely.bedwars.api.GameAPI; import de.marcely.bedwars.api.arena.Arena; +import de.marcely.bedwars.api.arena.ArenaStatus; import de.marcely.bedwars.api.arena.Team; import de.marcely.bedwars.api.event.player.PlayerOpenArenaChestEvent; import de.marcely.bedwars.api.message.Message; @@ -11,23 +13,46 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.jetbrains.annotations.Nullable; public class LockTeamChest implements Listener { - // Many people will want team chests disabled, use this with only regular chests @EventHandler public void playerOpenArenaChest(PlayerOpenArenaChestEvent event) { if (!MainConfig.lock_team_chest_enabled) return; - final Block block = event.getChestBlock(); + if (check(event.getPlayer(), event.getArena(), event.getTeam(), event.getChestBlock())) + event.setCancelled(true); + } - if (!MainConfig.lock_team_chest_materials.contains(block.getType())) + @EventHandler + public void playerInteract(PlayerInteractEvent event) { + // in case the given material was configured to not be a personal chest, + // but shall stil be locked + if (!MainConfig.lock_team_chest_enabled) + return; + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; - final Arena arena = event.getArena(); final Player player = event.getPlayer(); - final Team playerTeam = event.getTeam(); + final Arena arena = GameAPI.get().getArenaByPlayer(player); + + if (arena == null || arena.getStatus() != ArenaStatus.RUNNING) + return; + + final Team playerTeam = arena.getPlayerTeam(player); + + if (check(player, arena, playerTeam, event.getClickedBlock())) + event.setCancelled(true); + } + + private boolean check(Player player, Arena arena, Team playerTeam, Block block) { + if (!MainConfig.lock_team_chest_materials.contains(block.getType())) + return false; + final Team chestTeam = getChestTeam(arena, block); if (chestTeam != null && !arena.getPlayersInTeam(chestTeam).isEmpty() && chestTeam != playerTeam) { @@ -35,11 +60,13 @@ public void playerOpenArenaChest(PlayerOpenArenaChestEvent event) { .placeholder("team-name", chestTeam.getDisplayName()) .placeholder("team", chestTeam.getDisplayName()) .send(player); - - event.setCancelled(true); + return true; } + + return false; } + @Nullable private Team getChestTeam(Arena arena, Block chest) { if (arena.getGameWorld() == chest.getWorld()) { for (Team team : arena.getEnabledTeams()) {