diff --git a/src/main/java/net/knarcraft/blockhunt/BlockHunt.java b/src/main/java/net/knarcraft/blockhunt/BlockHunt.java index 02d9987..8b1c050 100644 --- a/src/main/java/net/knarcraft/blockhunt/BlockHunt.java +++ b/src/main/java/net/knarcraft/blockhunt/BlockHunt.java @@ -4,7 +4,6 @@ import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.MiscDisguise; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.arena.ArenaState; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.listener.OnBlockBreakEvent; @@ -23,15 +22,18 @@ import net.knarcraft.blockhunt.listener.OnPlayerTeleportEvent; import net.knarcraft.blockhunt.listener.OnSignChangeEvent; import net.knarcraft.blockhunt.manager.CommandManager; import net.knarcraft.blockhunt.manager.ConfigManager; +import net.knarcraft.blockhunt.util.ArenaHelper; import net.knarcraft.blockhunt.util.MessageHelper; +import net.knarcraft.blockhunt.util.PlayerHelper; +import net.knarcraft.blockhunt.util.ScoreboardHelper; +import net.knarcraft.blockhunt.util.SignsHelper; +import net.knarcraft.blockhunt.util.VisibilityHelper; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; import org.bukkit.configuration.serialization.ConfigurationSerialization; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -98,7 +100,7 @@ public class BlockHunt extends JavaPlugin implements Listener { return; } - ArenaHandler.loadArenas(); + ArenaHelper.loadArenas(); MessageHelper.sendMessage(null, MessageKey.LOG_ENABLED_PLUGIN, "name-" + BlockHunt.pluginDescriptionFile.getName(), "version-" + BlockHunt.pluginDescriptionFile.getVersion(), @@ -112,7 +114,7 @@ public class BlockHunt extends JavaPlugin implements Listener { public void onDisable() { for (Arena arena : MemoryStorage.arenaMap.values()) { String cause = "[BlockHunt] Arena " + arena.arenaName + " has been stopped"; - ArenaHandler.stopArena(arena, cause, MessageKey.WARNING_ARENA_STOPPED); + ArenaHelper.stopArena(arena, cause, MessageKey.WARNING_ARENA_STOPPED); } MessageHelper.sendMessage(null, MessageKey.LOG_DISABLED_PLUGIN, "name-" + @@ -145,7 +147,7 @@ public class BlockHunt extends JavaPlugin implements Listener { if (arena.playersInArena.size() >= arena.minPlayers) { arena.gameState = ArenaState.STARTING; arena.timer = arena.timeInLobbyUntilStart; - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_LOBBY_ARENA_IS_STARTING, "1-" + + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_LOBBY_ARENA_IS_STARTING, "1-" + arena.timeInLobbyUntilStart); } } else if (arena.gameState == ArenaState.STARTING) { @@ -162,9 +164,9 @@ public class BlockHunt extends JavaPlugin implements Listener { MemoryStorage.seekerTime.put(player, --seekerTime); if (seekerTime <= 0) { // Teleport the seeker to the hiders warp, and allow them to seek - PlayerHandler.teleport(player, arena.arenaLocations.getHidersWarp()); + PlayerHelper.teleport(player, arena.arenaLocations.getHidersWarp()); MemoryStorage.seekerTime.remove(player); - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_SEEKER_SPAWNED, + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_SEEKER_SPAWNED, "%playerName%-" + player.getName()); } } @@ -174,16 +176,17 @@ public class BlockHunt extends JavaPlugin implements Listener { updateInGameArena(arena); } - for (Player pl : arena.playersInArena) { - pl.setLevel(arena.timer); - if (arena.seekers.contains(pl)) { - pl.setGameMode(GameMode.SURVIVAL); + // Display countdown as the player's XP level + for (Player player : arena.playersInArena) { + player.setLevel(arena.timer); + if (arena.seekers.contains(player)) { + player.setGameMode(GameMode.SURVIVAL); } else { - pl.setGameMode(GameMode.ADVENTURE); + player.setGameMode(GameMode.ADVENTURE); } } } - SignsHandler.updateSigns(); //TODO Only do this when needed (game-state change or player count change) + SignsHelper.updateSigns(); //TODO Only do this when needed (game-state change or player count change) } /** @@ -197,7 +200,7 @@ public class BlockHunt extends JavaPlugin implements Listener { if (arena.timer > 0) { if (arena.timer == 60 || arena.timer == 30 || arena.timer == 10) { // Announce when the arena starts - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_LOBBY_ARENA_IS_STARTING, "1-" + arena.timer); + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_LOBBY_ARENA_IS_STARTING, "1-" + arena.timer); } else if (arena.timer <= 5) { // Count down from 5 seconds World world = null; @@ -210,7 +213,7 @@ public class BlockHunt extends JavaPlugin implements Listener { world.playSound(arena.arenaLocations.getLobbyWarp(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, pitch); } - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_LOBBY_ARENA_IS_STARTING, "1-" + arena.timer); + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_LOBBY_ARENA_IS_STARTING, "1-" + arena.timer); } } else { startArena(arena); @@ -267,7 +270,7 @@ public class BlockHunt extends JavaPlugin implements Listener { DisguiseAPI.disguiseToAll(arenaPlayer, disguise); // Teleport to the hiders warp - PlayerHandler.teleport(arenaPlayer, arena.arenaLocations.getHidersWarp()); + PlayerHelper.teleport(arenaPlayer, arena.arenaLocations.getHidersWarp()); // Put the block in the player's inventory and on the player's head, so they know which block they are ItemStack blockTimer = new ItemStack(block.getType(), 5); @@ -330,9 +333,9 @@ public class BlockHunt extends JavaPlugin implements Listener { * @param player

The player to assign as a seeker

*/ private void addSeeker(Arena arena, Player player) { - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_SEEKER_CHOSEN, "seeker-" + player.getName()); + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_SEEKER_CHOSEN, "seeker-" + player.getName()); arena.seekers.add(player); - PlayerHandler.teleport(player, arena.arenaLocations.getSeekersWarp()); + PlayerHelper.teleport(player, arena.arenaLocations.getSeekersWarp()); player.getInventory().clear(); player.setWalkSpeed(0.3F); MemoryStorage.seekerTime.put(player, arena.waitingTimeSeeker); @@ -373,7 +376,7 @@ public class BlockHunt extends JavaPlugin implements Listener { // If the game ends, trigger the hiders' win if (arena.timer <= 0) { - ArenaHandler.hidersWin(arena); + ArenaHelper.hidersWin(arena); return; } @@ -397,12 +400,12 @@ public class BlockHunt extends JavaPlugin implements Listener { remainingBlocks.add(uppercaseAllFirst(block.replace("_", " "))); } String blocklist = String.join(", ", remainingBlocks); - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_BLOCKS_LEFT, "1-" + blocklist); + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_BLOCKS_LEFT, "1-" + blocklist); } // Count down towards the end of the arena if (arena.timer == 190 || arena.timer == 60 || arena.timer == 30 || arena.timer == 10 || arena.timer <= 5) { - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_ARENA_END, "1-" + arena.timer); + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_ARENA_END, "1-" + arena.timer); } // Play a sound for the last 5 seconds of the arena game's duration if (arena.timer <= 5) { @@ -417,7 +420,7 @@ public class BlockHunt extends JavaPlugin implements Listener { for (Player player : arena.hiders) { updateHiddenState(player); } - ScoreboardHandler.updateScoreboard(arena); // TODO Only do this when needed (player added/removed) + ScoreboardHelper.updateScoreboard(arena); // TODO Only do this when needed (player added/removed) } /** @@ -447,74 +450,15 @@ public class BlockHunt extends JavaPlugin implements Listener { // Just decrease the timer inventoryBlock.setAmount(inventoryBlock.getAmount() - 1); } else { - // Try to make the player solid - Block playerBlock = player.getLocation().getBlock(); - BlockData playerBlockData = playerBlock.getBlockData(); - if (playerBlockData.getMaterial().isAir() || playerBlockData.getMaterial().equals(Material.WATER)) { - makePlayerSolid(player, playerBlock, playerBlockData, inventoryBlock, playerLocation); - } else { - MessageHelper.sendMessage(player, MessageKey.WARNING_IN_GAME_NO_SOLID_PLACE); - } + VisibilityHelper.makePlayerSolid(player, inventoryBlock); } } else { // The player moved. Un-hide and reset the hide timer inventoryBlock.setAmount(5); if (!DisguiseAPI.isDisguised(player)) { - SolidBlockHandler.makePlayerUnsolid(player); + VisibilityHelper.makePlayerUnSolid(player); } } } - /** - * Makes a player into a perceived solid block - * - * @param player

The player to make solid

- * @param playerBlock

The block the player is currently standing at

- * @param playerBlockData

The data of the block the player is currently standing at

- * @param inventoryBlock

The inventory block which corresponds to the player's hide material

- * @param playerLocation

The current location of the player

- */ - private void makePlayerSolid(Player player, Block playerBlock, BlockData playerBlockData, ItemStack inventoryBlock, - Location playerLocation) { - // Store whether the player is replacing water so the water can be restored afterwards - if (playerBlockData.getMaterial().equals(Material.WATER)) { - MemoryStorage.hiddenLocationWater.put(player, true); - } else { - MemoryStorage.hiddenLocationWater.put(player, false); - } - - if (DisguiseAPI.isDisguised(player)) { - // Hide the player, and make all other players see a full block in the player's location - DisguiseAPI.undisguiseToAll(player); - for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { - if (!onlinePlayer.equals(player)) { - onlinePlayer.hidePlayer(this, player); - onlinePlayer.sendBlockChange(playerBlock.getLocation(), - inventoryBlock.getType().createBlockData()); - } - } - - inventoryBlock.addUnsafeEnchantment(Enchantment.DURABILITY, 10); - player.playSound(playerLocation, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - // Store the location the player is hidden at - MemoryStorage.hiddenLocation.put(player, playerLocation); - - // Announce to the player that they are now hidden - String blockName = inventoryBlock.getType().name(); - blockName = uppercaseAllFirst(blockName.replace("_", " ")); - MessageHelper.sendMessage(player, MessageKey.NORMAL_IN_GAME_NOW_SOLID, "block-" - + blockName); - } - - for (Player otherPlayer : Bukkit.getOnlinePlayers()) { - if (otherPlayer.equals(player)) { - continue; - } - - // Hide the player and update the perceived - otherPlayer.hidePlayer(this, player); - otherPlayer.sendBlockChange(playerBlock.getLocation(), inventoryBlock.getType().createBlockData()); - } - } - } diff --git a/src/main/java/net/knarcraft/blockhunt/MemoryStorage.java b/src/main/java/net/knarcraft/blockhunt/MemoryStorage.java index 5fa815e..74a4e50 100644 --- a/src/main/java/net/knarcraft/blockhunt/MemoryStorage.java +++ b/src/main/java/net/knarcraft/blockhunt/MemoryStorage.java @@ -4,6 +4,7 @@ import net.knarcraft.blockhunt.arena.Arena; import net.knarcraft.blockhunt.manager.Command; import net.knarcraft.blockhunt.manager.ConfigManager; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -51,8 +52,9 @@ public class MemoryStorage { public static final Map moveLocation = new HashMap<>(); public static final Map hiddenLocation = new HashMap<>(); // Whether the player's hidden location contained water - public static final Map hiddenLocationWater = new HashMap<>(); + public static final Map hiddenLocationMaterial = new HashMap<>(); public static final Map teleportLocation = new HashMap<>(); + public static final Map playerArena = new HashMap<>(); } diff --git a/src/main/java/net/knarcraft/blockhunt/PlayerArenaData.java b/src/main/java/net/knarcraft/blockhunt/PlayerArenaData.java index b69722a..12c34b6 100644 --- a/src/main/java/net/knarcraft/blockhunt/PlayerArenaData.java +++ b/src/main/java/net/knarcraft/blockhunt/PlayerArenaData.java @@ -7,6 +7,21 @@ import org.bukkit.potion.PotionEffect; import java.util.Collection; +/** + * A record storing a player's data before they entered an arena + * + * @param playerLocation

The location the player was at before joining the arena

+ * @param playerGameMode

The game mode the player was in

+ * @param playerInventory

The player's earlier inventory

+ * @param playerArmor

The player's earlier equipped armor

+ * @param playerEXP

The player's earlier exp amount

+ * @param playerEXPLevels

The player's earlier exp level

+ * @param playerMaxHealth

The player's previous max health

+ * @param playerHealth

The player's previous health

+ * @param playerFood

The player's previous food amount

+ * @param playerPotionEffects

The player's previous potion effects

+ * @param playerFlying

The player's previous flying state

+ */ public record PlayerArenaData(Location playerLocation, GameMode playerGameMode, ItemStack[] playerInventory, ItemStack[] playerArmor, Float playerEXP, Integer playerEXPLevels, Double playerMaxHealth, Double playerHealth, Integer playerFood, Collection playerPotionEffects, diff --git a/src/main/java/net/knarcraft/blockhunt/SolidBlockHandler.java b/src/main/java/net/knarcraft/blockhunt/SolidBlockHandler.java deleted file mode 100644 index 2eabeaf..0000000 --- a/src/main/java/net/knarcraft/blockhunt/SolidBlockHandler.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.knarcraft.blockhunt; - -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.MiscDisguise; -import net.knarcraft.blockhunt.config.MessageKey; -import net.knarcraft.blockhunt.util.MessageHelper; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.block.Block; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.logging.Level; - -public class SolidBlockHandler { - - public static void makePlayerUnsolid(Player player) { - ItemStack block = player.getInventory().getItem(8); - if (block == null) { - player.sendMessage(ChatColor.RED + "Unable to hide you because your inventory block is missing!"); - BlockHunt.plugin.getLogger().log(Level.SEVERE, player.getName() + " could not be hidden because " + - "their inventory block was missing!"); - return; - } - - Block pBlock = player.getLocation().getBlock(); - - if (MemoryStorage.hiddenLocation.get(player) != null) { - pBlock = MemoryStorage.hiddenLocation.get(player).getBlock(); - } - - block.setAmount(5); - for (Player pl : Bukkit.getOnlinePlayers()) { - if (pl.equals(player)) { - continue; - } - if (MemoryStorage.hiddenLocationWater.get(player) != null) { - if (MemoryStorage.hiddenLocationWater.get(player)) { - pl.sendBlockChange(pBlock.getLocation(), Bukkit.createBlockData(Material.WATER)); - } else { - pl.sendBlockChange(pBlock.getLocation(), Bukkit.createBlockData(Material.AIR)); - } - } else { - pl.sendBlockChange(pBlock.getLocation(), Bukkit.createBlockData(Material.AIR)); - } - - MemoryStorage.hiddenLocationWater.remove(player); - } - - player.playSound(player.getLocation(), Sound.ENTITY_BAT_HURT, 1, 1); - block.removeEnchantment(Enchantment.DURABILITY); - - for (Player playerShow : Bukkit.getOnlinePlayers()) { - playerShow.showPlayer(BlockHunt.plugin, player); - } - - MiscDisguise disguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, block.getType()); - DisguiseAPI.disguiseToAll(player, disguise); - - MessageHelper.sendMessage(player, MessageKey.NORMAL_IN_GAME_NO_MORE_SOLID); - } - -} diff --git a/src/main/java/net/knarcraft/blockhunt/arena/ArenaHandler.java b/src/main/java/net/knarcraft/blockhunt/arena/ArenaHandler.java deleted file mode 100644 index 58dc85d..0000000 --- a/src/main/java/net/knarcraft/blockhunt/arena/ArenaHandler.java +++ /dev/null @@ -1,469 +0,0 @@ -package net.knarcraft.blockhunt.arena; - -import me.libraryaddict.disguise.DisguiseAPI; -import net.knarcraft.blockhunt.BlockHunt; -import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.PlayerArenaData; -import net.knarcraft.blockhunt.PlayerHandler; -import net.knarcraft.blockhunt.ScoreboardHandler; -import net.knarcraft.blockhunt.SignsHandler; -import net.knarcraft.blockhunt.config.ConfigKey; -import net.knarcraft.blockhunt.config.MessageKey; -import net.knarcraft.blockhunt.config.Permission; -import net.knarcraft.blockhunt.event.EndArenaEvent; -import net.knarcraft.blockhunt.event.JoinArenaEvent; -import net.knarcraft.blockhunt.event.LeaveArenaEvent; -import net.knarcraft.blockhunt.manager.PermissionsManager; -import net.knarcraft.blockhunt.util.MessageHelper; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.attribute.Attribute; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.potion.PotionEffect; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; - -public class ArenaHandler { - - public static void loadArenas() { - MemoryStorage.arenaMap.clear(); - for (String arenaName : MemoryStorage.arenas.getFileConfiguration().getKeys(false)) { - MemoryStorage.arenaMap.put(arenaName.toLowerCase(), (Arena) MemoryStorage.arenas.getFileConfiguration().get(arenaName)); - } - - for (Arena arena : MemoryStorage.arenaMap.values()) { - ScoreboardHandler.createScoreboard(arena); - } - } - - /** - * Sends a message to all players in an arena - * - * @param arena

The arena to announce to

- * @param message

The message to display

- * @param variables

The variables to replace in the message

- */ - public static void sendMessage(Arena arena, String message, String... variables) { - MessageHelper.broadcastMessage(arena.playersInArena, message, variables); - } - - /** - * Sends a message to all players in an arena - * - * @param arena

The arena to announce to

- * @param messageKey

The message key defining the string to display

- * @param variables

The variables to replace in the message

- */ - public static void sendMessage(Arena arena, MessageKey messageKey, String... variables) { - MessageHelper.broadcastMessage(arena.playersInArena, messageKey, variables); - } - - public static void playerJoinArena(Player player, String arenaName) { - boolean alreadyJoined = false; - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena != null && arena.playersInArena.contains(player)) { - alreadyJoined = true; - break; - } - } - - if (alreadyJoined) { - MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_ALREADY_JOINED); - return; - } - - Arena arena = MemoryStorage.arenaMap.get(arenaName.toLowerCase()); - if (arena != null) { - if (arena.disguiseBlocks.isEmpty()) { - MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_NO_BLOCKS_SET); - } else { - boolean inventoryEmpty = true; - for (ItemStack inventoryItem : player.getInventory()) { - if (inventoryItem != null && inventoryItem.getType() != Material.AIR) { - inventoryEmpty = false; - } - } - - for (ItemStack inventoryItem : player.getInventory().getArmorContents()) { - if (inventoryItem != null && inventoryItem.getType() != Material.AIR) { - inventoryEmpty = false; - } - } - - if ((Boolean) MemoryStorage.config.get(ConfigKey.REQUIRE_INVENTORY_CLEAR_ON_JOIN) && !inventoryEmpty) { - MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_INVENTORY_NOT_EMPTY); - return; - } - - Location zero = new Location(Bukkit.getWorld(player.getWorld().getName()), 0, 0, 0, 0, 0); - ArenaLocations locations = arena.arenaLocations; - if (locations.getLobbyWarp() != null && locations.getHidersWarp() != null && - locations.getSeekersWarp() != null && locations.getExitWarp() != null) { - if (!locations.getLobbyWarp().equals(zero) && !locations.getHidersWarp().equals(zero) && - !locations.getSeekersWarp().equals(zero) && !locations.getExitWarp().equals(zero)) { - if (arena.gameState == ArenaState.WAITING || arena.gameState == ArenaState.STARTING) { - if (arena.playersInArena.size() >= arena.maxPlayers && - !PermissionsManager.hasPermission(player, Permission.JOIN_FULL, false)) { - MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_FULL); - return; - } - - boolean canWarp = PlayerHandler.teleport(player, locations.getLobbyWarp()); - if (!canWarp) { - MessageHelper.sendMessage(player, MessageKey.ERROR_TELEPORT_FAILED); - return; - } - - BlockHunt.plugin.getLogger().log(Level.INFO, player.getName() + " has joined " + arenaName); - arena.playersInArena.add(player); - JoinArenaEvent event = new JoinArenaEvent(player, arena); - Bukkit.getPluginManager().callEvent(event); - - PlayerArenaData pad = new PlayerArenaData(player.getLocation(), player.getGameMode(), player.getInventory().getContents(), player - .getInventory().getArmorContents(), player.getExp(), player.getLevel(), player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(), player.getHealth(), player.getFoodLevel(), - player.getActivePotionEffects(), player.getAllowFlight()); - - MemoryStorage.playerData.put(player, pad); - - player.setGameMode(GameMode.SURVIVAL); - for (PotionEffect pe : player.getActivePotionEffects()) { - player.removePotionEffect(pe.getType()); - } - player.setFoodLevel(20); - player.setHealth(20); - player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(20); - player.setLevel(arena.timer); - player.setExp(0); - player.getInventory().clear(); - player.getInventory().setHelmet(new ItemStack(Material.AIR)); - player.getInventory().setChestplate(new ItemStack(Material.AIR)); - player.getInventory().setLeggings(new ItemStack(Material.AIR)); - player.getInventory().setBoots(new ItemStack(Material.AIR)); - player.setFlying(false); - player.setAllowFlight(false); - player.setWalkSpeed(0.2F); - - // Fix for client not showing players after - // they join - for (Player otherPlayer : arena.playersInArena) { - if (otherPlayer.canSee(player)) { - otherPlayer.showPlayer(BlockHunt.plugin, player); // Make - } - // new - // player - // visible - // to - // others - if (player.canSee(otherPlayer)) { - player.showPlayer(BlockHunt.plugin, otherPlayer); // Make - } - // other - // players - // visible - // to - // new - // player - } - - if ((Boolean) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_ENABLED)) { - if (MemoryStorage.shop.getFileConfiguration().get(player.getName() + ".blockchooser") != null - || PermissionsManager.hasPermission(player, Permission.SHOP_BLOCK_CHOOSER, false)) { - ItemStack shopBlockChooser = new ItemStack(Material.getMaterial((String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_ID_NAME)), 1); - ItemMeta shopBlockChooser_IM = shopBlockChooser.getItemMeta(); - shopBlockChooser_IM.setDisplayName(MessageHelper.replaceAll((String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME))); - List loreStrings = MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_DESCRIPTION.getPath()); - List loreStrings2 = new ArrayList<>(); - for (String lore : loreStrings) { - loreStrings2.add(MessageHelper.replaceAll(lore)); - } - shopBlockChooser_IM.setLore(loreStrings2); - shopBlockChooser.setItemMeta(shopBlockChooser_IM); - - player.getInventory().addItem(shopBlockChooser); - } - } - - if ((Boolean) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_ENABLED)) { - if (MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".blockhuntpass") != 0) { - ItemStack shopBlockHuntPass = new ItemStack(Material.getMaterial((String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_ID_NAME)), - 1); - ItemMeta shopBlockHuntPass_IM = shopBlockHuntPass.getItemMeta(); - shopBlockHuntPass_IM.setDisplayName(MessageHelper.replaceAll((String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_NAME))); - List loreStrings = MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_DESCRIPTION.getPath()); - List loreStrings2 = new ArrayList<>(); - for (String lore : loreStrings) { - loreStrings2.add(MessageHelper.replaceAll(lore)); - } - - shopBlockHuntPass_IM.setLore(loreStrings2); - shopBlockHuntPass.setItemMeta(shopBlockHuntPass_IM); - shopBlockHuntPass.setAmount(MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".blockhuntpass")); - - player.getInventory().addItem(shopBlockHuntPass); - } - } - - DisguiseAPI.undisguiseToAll(player); - - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_JOIN_JOINED_ARENA, "%playerName%-" + player.getName(), - "1-" + arena.playersInArena.size(), "2-" + arena.maxPlayers); - if (arena.playersInArena.size() < arena.minPlayers) { - sendMessage(arena, MessageKey.WARNING_LOBBY_NEED_AT_LEAST, "1-" + arena.minPlayers); - } - } else { - MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_ARENA_IN_GAME); - } - } else { - MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_WARPS_NOT_SET); - } - } else { - MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_WARPS_NOT_SET); - } - } - } else { - MessageHelper.sendMessage(player, MessageKey.ERROR_NO_ARENA, "name-" + arenaName); - } - - SignsHandler.updateSigns(); - } - - public static void playerLeaveArena(Player player, boolean message, boolean cleanup) { - - Arena arena = null; - for (Arena arena2 : MemoryStorage.arenaMap.values()) { - if (arena2.playersInArena != null) { - if (arena2.playersInArena.contains(player)) { - arena = arena2; - } - } - } - - if (arena != null) { - BlockHunt.plugin.getLogger().log(Level.INFO, player.getName() + " has left " + arena.arenaName); - LeaveArenaEvent event = new LeaveArenaEvent(player, arena); - Bukkit.getPluginManager().callEvent(event); - - if (cleanup) { - arena.playersInArena.remove(player); - arena.seekers.remove(player); - arena.hiders.remove(player); - - if (arena.playersInArena.size() < arena.minPlayers && arena.gameState.equals(ArenaState.STARTING)) { - arena.gameState = ArenaState.WAITING; - arena.timer = 0; - - sendMessage(arena, MessageKey.WARNING_LOBBY_NEED_AT_LEAST, "1-" + arena.minPlayers); - } - - if (arena.playersInArena.size() <= 1 && arena.gameState == ArenaState.IN_GAME) { - if (arena.seekers.size() >= arena.playersInArena.size()) { - ArenaHandler.seekersWin(arena); - } else { - ArenaHandler.hidersWin(arena); - } - } - - if (arena.seekers.size() >= arena.playersInArena.size()) { - ArenaHandler.seekersWin(arena); - } - - if (arena.seekers.size() == 0 && arena.gameState == ArenaState.IN_GAME) { - Player seeker = arena.playersInArena.get(MemoryStorage.random.nextInt(arena.playersInArena.size())); - ArenaHandler.sendMessage(arena, MessageKey.WARNING_IN_GAME_NEW_SEEKER_CHOSEN, "seeker-" + seeker.getName()); - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_SEEKER_CHOSEN, "seeker-" + seeker.getName()); - DisguiseAPI.undisguiseToAll(seeker); - for (Player pl : Bukkit.getOnlinePlayers()) { - pl.showPlayer(BlockHunt.plugin, seeker); - } - seeker.getInventory().clear(); - arena.seekers.add(seeker); - PlayerHandler.teleport(seeker, arena.arenaLocations.getSeekersWarp()); - MemoryStorage.seekerTime.put(seeker, arena.waitingTimeSeeker); - seeker.setWalkSpeed(0.3F); - - // Fix for client not showing players after they join - for (Player otherPlayer : arena.playersInArena) { - if (otherPlayer.canSee(player)) { - otherPlayer.showPlayer(BlockHunt.plugin, player); // Make new player - } - // visible to others - if (player.canSee(otherPlayer)) { - player.showPlayer(BlockHunt.plugin, otherPlayer); // Make other - } - // players visible - // to new player - } - } - } - - PlayerArenaData pad = new PlayerArenaData(null, null, null, null, null, null, null, null, null, null, false); - - if (MemoryStorage.playerData.get(player) != null) { - pad = MemoryStorage.playerData.get(player); - } - - player.getInventory().clear(); - player.getInventory().setContents(pad.playerInventory()); - player.getInventory().setArmorContents(pad.playerArmor()); - player.setExp(pad.playerEXP()); - player.setLevel(pad.playerEXPLevels()); - player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(pad.playerMaxHealth()); - player.setHealth(pad.playerHealth()); - player.setFoodLevel(pad.playerFood()); - player.addPotionEffects(pad.playerPotionEffects()); - PlayerHandler.teleport(player, arena.arenaLocations.getExitWarp()); - player.setGameMode(pad.playerGameMode()); - player.setAllowFlight(pad.playerFlying()); - if (player.getAllowFlight()) { - player.setFlying(true); - } - player.setWalkSpeed(0.2F); - - MemoryStorage.playerData.remove(player); - MemoryStorage.chosenBlock.remove(player); - - for (Player pl : Bukkit.getOnlinePlayers()) { - pl.showPlayer(BlockHunt.plugin, player); - if (MemoryStorage.hiddenLocation.get(player) != null) { - if (MemoryStorage.hiddenLocationWater.get(player) != null) { - Block pBlock = MemoryStorage.hiddenLocation.get(player).getBlock(); - if (MemoryStorage.hiddenLocationWater.get(player)) { - pl.sendBlockChange(pBlock.getLocation(), Bukkit.createBlockData(Material.WATER)); - } else { - pl.sendBlockChange(pBlock.getLocation(), Bukkit.createBlockData(Material.AIR)); - } - } - } - - DisguiseAPI.undisguiseToAll(player); - } - - ScoreboardHandler.removeScoreboard(player); - - MessageHelper.sendMessage(player, MessageKey.NORMAL_LEAVE_YOU_LEFT); - if (message) { - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_LEAVE_LEFT_ARENA, "%playerName%-" + player.getName(), "1-" + arena.playersInArena.size(), "2-" - + arena.maxPlayers); - } - } else { - if (message) { - MessageHelper.sendMessage(player, MessageKey.ERROR_LEAVE_NOT_IN_ARENA); - } - return; - } - - SignsHandler.updateSigns(); - } - - public static void seekersWin(Arena arena) { - String cause = "[BlockHunt] Seekers have won " + arena.arenaName; - - List winners = new ArrayList<>(); - List losers = new ArrayList<>(); - - for (Player player : arena.playersInArena) { - - if (arena.seekers.contains(player)) { - - winners.add(player); - - if (arena.seekersWinCommands != null) { - for (String command : arena.seekersWinCommands) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.replaceAll("%player%", player.getDisplayName())); - } - - if (MemoryStorage.shop.getFileConfiguration().get(player.getName() + ".tokens") == null) { - MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", 0); - MemoryStorage.shop.save(); - } - int playerTokens = MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".tokens"); - MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", playerTokens + arena.seekersTokenWin); - MemoryStorage.shop.save(); - - MessageHelper.sendMessage(player, MessageKey.NORMAL_ADDED_TOKEN, "amount-" + arena.seekersTokenWin); - - } - - } else { - losers.add(player); - } - } - - EndArenaEvent event = new EndArenaEvent(winners, losers, arena); - Bukkit.getServer().getPluginManager().callEvent(event); - stopArena(arena, cause, MessageKey.normal_winSeekers); - } - - public static void hidersWin(Arena arena) { - String cause = "[BlockHunt] Hiders have won " + arena.arenaName; - - List winners = new ArrayList<>(); - List losers = new ArrayList<>(); - - for (Player player : arena.playersInArena) { - - if (arena.seekers.contains(player)) { - losers.add(player); - } else { - - winners.add(player); - - if (arena.hidersWinCommands != null) { - for (String command : arena.hidersWinCommands) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.replaceAll("%player%", player.getDisplayName())); - } - - if (MemoryStorage.shop.getFileConfiguration().get(player.getName() + ".tokens") == null) { - MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", 0); - MemoryStorage.shop.save(); - } - int playerTokens = MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".tokens"); - MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", playerTokens + arena.hidersTokenWin); - MemoryStorage.shop.save(); - - MessageHelper.sendMessage(player, MessageKey.NORMAL_ADDED_TOKEN, "amount-" + arena.hidersTokenWin); - } - } - - } - - EndArenaEvent event = new EndArenaEvent(winners, losers, arena); - Bukkit.getServer().getPluginManager().callEvent(event); - stopArena(arena, cause, MessageKey.NORMAL_WIN_HIDERS); - } - - public static void stopArena(Arena arena, String cause, MessageKey message) { - BlockHunt.plugin.getLogger().log(Level.INFO, cause); - ArenaHandler.sendMessage(arena, message); - arena.seekers.clear(); - arena.hiders.clear(); - - for (Player player : arena.playersInArena) { - playerLeaveArena(player, false, false); - player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 1); - } - - arena.gameState = ArenaState.WAITING; - arena.timer = 0; - arena.playersInArena.clear(); - } - - public static boolean noPlayersInArenas() { - // Check if there are any players in any arena (quick way to early exit for event handlers) - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.size() > 0) { - return false; - } - } - return true; - } - -} diff --git a/src/main/java/net/knarcraft/blockhunt/command/CreateCommand.java b/src/main/java/net/knarcraft/blockhunt/command/CreateCommand.java index ea9a98f..2cb6174 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/CreateCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/CreateCommand.java @@ -1,12 +1,12 @@ package net.knarcraft.blockhunt.command; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.ScoreboardHandler; import net.knarcraft.blockhunt.arena.Arena; import net.knarcraft.blockhunt.arena.ArenaState; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.manager.CommandManager; import net.knarcraft.blockhunt.util.MessageHelper; +import net.knarcraft.blockhunt.util.ScoreboardHelper; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -40,7 +40,7 @@ public class CreateCommand extends DefaultCommand { MemoryStorage.signs.load(); MemoryStorage.arenaMap.put(args[1].toLowerCase(), arena); - ScoreboardHandler.createScoreboard(arena); + ScoreboardHelper.createScoreboard(arena); MessageHelper.sendMessage(player, MessageKey.NORMAL_CREATE_CREATED_ARENA, "name-" + args[1]); } else { diff --git a/src/main/java/net/knarcraft/blockhunt/command/JoinCommand.java b/src/main/java/net/knarcraft/blockhunt/command/JoinCommand.java index f484f00..97f9603 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/JoinCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/JoinCommand.java @@ -1,8 +1,8 @@ package net.knarcraft.blockhunt.command; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.manager.CommandManager; +import net.knarcraft.blockhunt.util.ArenaHelper; import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.entity.Player; @@ -15,7 +15,7 @@ public class JoinCommand extends DefaultCommand { MessageHelper.sendMessage(player, MessageKey.ERROR_NOT_ENOUGH_ARGUMENTS, "syntax-" + CommandManager.getJoinCommand().usage()); } else { - ArenaHandler.playerJoinArena(player, args[1]); + ArenaHelper.playerJoinArena(player, args[1]); } } else { MessageHelper.sendMessage(null, MessageKey.ERROR_ONLY_IN_GAME); diff --git a/src/main/java/net/knarcraft/blockhunt/command/LeaveCommand.java b/src/main/java/net/knarcraft/blockhunt/command/LeaveCommand.java index bf7883e..3e8cbfe 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/LeaveCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/LeaveCommand.java @@ -1,7 +1,7 @@ package net.knarcraft.blockhunt.command; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.config.MessageKey; +import net.knarcraft.blockhunt.util.ArenaHelper; import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.entity.Player; @@ -10,7 +10,7 @@ public class LeaveCommand extends DefaultCommand { @Override public boolean execute(Player player, String[] args) { if (player != null) { - ArenaHandler.playerLeaveArena(player, true, true); + ArenaHelper.playerLeaveArena(player, true, true); } else { MessageHelper.sendMessage(null, MessageKey.ERROR_ONLY_IN_GAME); } diff --git a/src/main/java/net/knarcraft/blockhunt/command/ReloadCommand.java b/src/main/java/net/knarcraft/blockhunt/command/ReloadCommand.java index 1c25dff..25b7d06 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/ReloadCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/ReloadCommand.java @@ -2,9 +2,9 @@ package net.knarcraft.blockhunt.command; import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.manager.ConfigManager; +import net.knarcraft.blockhunt.util.ArenaHelper; import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.entity.Player; @@ -22,10 +22,10 @@ public class ReloadCommand extends DefaultCommand { MemoryStorage.shop.load(); for (Arena arena : MemoryStorage.arenaMap.values()) { String cause = "[BlockHunt] Arena " + arena.arenaName + " has been stopped"; - ArenaHandler.stopArena(arena, cause, MessageKey.WARNING_ARENA_STOPPED); + ArenaHelper.stopArena(arena, cause, MessageKey.WARNING_ARENA_STOPPED); } - ArenaHandler.loadArenas(); + ArenaHelper.loadArenas(); MessageHelper.sendMessage(player, MessageKey.NORMAL_RELOADED_CONFIGS); return true; } diff --git a/src/main/java/net/knarcraft/blockhunt/command/RemoveCommand.java b/src/main/java/net/knarcraft/blockhunt/command/RemoveCommand.java index 852fe75..571837a 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/RemoveCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/RemoveCommand.java @@ -44,7 +44,7 @@ public class RemoveCommand extends DefaultCommand { MessageHelper.sendMessage(player, MessageKey.ERROR_NO_ARENA, "name-" + args[1]); } } else { - MessageHelper.sendMessage(player, MessageKey.ERROR_ONLY_IN_GAME); + MessageHelper.sendMessage(null, MessageKey.ERROR_ONLY_IN_GAME); } return true; } diff --git a/src/main/java/net/knarcraft/blockhunt/command/SetCommand.java b/src/main/java/net/knarcraft/blockhunt/command/SetCommand.java index 8eabb79..d714bac 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/SetCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/SetCommand.java @@ -1,8 +1,8 @@ package net.knarcraft.blockhunt.command; -import net.knarcraft.blockhunt.InventoryHandler; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.manager.CommandManager; +import net.knarcraft.blockhunt.util.InventoryHelper; import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.entity.Player; @@ -16,7 +16,7 @@ public class SetCommand extends DefaultCommand { CommandManager.getSetCommand().usage()); } else { String arenaName = args[1]; - InventoryHandler.openPanel(player, arenaName); + InventoryHelper.openPanel(player, arenaName); } } else { MessageHelper.sendMessage(player, MessageKey.ERROR_ONLY_IN_GAME); diff --git a/src/main/java/net/knarcraft/blockhunt/command/SetWarpCommand.java b/src/main/java/net/knarcraft/blockhunt/command/SetWarpCommand.java index 970fcca..01e1aad 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/SetWarpCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/SetWarpCommand.java @@ -2,10 +2,10 @@ package net.knarcraft.blockhunt.command; import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.arena.ArenaLocations; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.manager.CommandManager; +import net.knarcraft.blockhunt.util.ArenaHelper; import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -58,7 +58,7 @@ public class SetWarpCommand extends DefaultCommand { public void save(Arena arena) { MemoryStorage.arenas.getFileConfiguration().set(arena.arenaName, arena); MemoryStorage.arenas.save(); - ArenaHandler.loadArenas(); + ArenaHelper.loadArenas(); } } diff --git a/src/main/java/net/knarcraft/blockhunt/command/ShopCommand.java b/src/main/java/net/knarcraft/blockhunt/command/ShopCommand.java index 4982df1..d34b54f 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/ShopCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/ShopCommand.java @@ -1,13 +1,13 @@ package net.knarcraft.blockhunt.command; -import net.knarcraft.blockhunt.InventoryHandler; +import net.knarcraft.blockhunt.util.InventoryHelper; import org.bukkit.entity.Player; public class ShopCommand extends DefaultCommand { @Override public boolean execute(Player player, String[] args) { - InventoryHandler.openShop(player); + InventoryHelper.openShop(player); return true; } } diff --git a/src/main/java/net/knarcraft/blockhunt/command/TokensCommand.java b/src/main/java/net/knarcraft/blockhunt/command/TokensCommand.java index 7314342..ca204c6 100644 --- a/src/main/java/net/knarcraft/blockhunt/command/TokensCommand.java +++ b/src/main/java/net/knarcraft/blockhunt/command/TokensCommand.java @@ -1,9 +1,9 @@ package net.knarcraft.blockhunt.command; -import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.manager.CommandManager; import net.knarcraft.blockhunt.util.MessageHelper; +import net.knarcraft.blockhunt.util.TokensHelper; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -37,32 +37,37 @@ public class TokensCommand extends DefaultCommand { } if (option.equalsIgnoreCase("set")) { - MemoryStorage.shop.getFileConfiguration().set(tokenPlayer.getName() + ".tokens", amount); - MemoryStorage.shop.save(); - MessageHelper.sendMessage(player, MessageKey.NORMAL_TOKENS_CHANGED, "option-Set", "%playerName%-" + tokenPlayer.getName(), "option2-to", "amount-" + amount); - MessageHelper.sendMessage(tokenPlayer, MessageKey.NORMAL_TOKENS_CHANGED_PERSON, "option-set", "%playerName%-" + name, "option2-to", "amount-" + amount); + updateTokens(player, tokenPlayer, name, amount, "Set", "to"); } else if (option.equalsIgnoreCase("add")) { - int tokens = 0; - if (MemoryStorage.shop.getFileConfiguration().getInt(tokenPlayer.getName() + ".tokens") != 0) { - tokens = MemoryStorage.shop.getFileConfiguration().getInt(tokenPlayer.getName() + ".tokens"); - } - MemoryStorage.shop.getFileConfiguration().set(tokenPlayer.getName() + ".tokens", tokens + amount); - MemoryStorage.shop.save(); - MessageHelper.sendMessage(player, MessageKey.NORMAL_TOKENS_CHANGED, "option-Added", "%playerName%-" + tokenPlayer.getName(), "option2-to", "amount-" + amount); - MessageHelper.sendMessage(tokenPlayer, MessageKey.NORMAL_TOKENS_CHANGED_PERSON, "option-added", "%playerName%-" + name, "option2-to", "amount-" + amount); + updateTokens(player, tokenPlayer, name, TokensHelper.getTokens(tokenPlayer) + amount, + "Added", "to"); } else if (option.equalsIgnoreCase("take")) { - int tokens = 0; - if (MemoryStorage.shop.getFileConfiguration().getInt(tokenPlayer.getName() + ".tokens") != 0) { - tokens = MemoryStorage.shop.getFileConfiguration().getInt(tokenPlayer.getName() + ".tokens"); - } - MemoryStorage.shop.getFileConfiguration().set(tokenPlayer.getName() + ".tokens", tokens - amount); - MemoryStorage.shop.save(); - MessageHelper.sendMessage(player, MessageKey.NORMAL_TOKENS_CHANGED, "option-Took", "%playerName%-" + tokenPlayer.getName(), "option2-from", "amount-" + amount); - MessageHelper.sendMessage(tokenPlayer, MessageKey.NORMAL_TOKENS_CHANGED_PERSON, "option-took", "%playerName%-" + name, "option2-from", "amount-" + amount); + updateTokens(player, tokenPlayer, name, TokensHelper.getTokens(tokenPlayer) - amount, + "Took", "from"); } else { MessageHelper.sendMessage(player, MessageKey.ERROR_TOKENS_UNKNOWN_SETTING, "option-" + option); } } return true; } + + /** + * Updates tokens for a player + * + * @param player

The player that's changing tokens

+ * @param tokenPlayer

The player whose tokens are changed

+ * @param name

The name of the player that's changing tokens

+ * @param newTokens

The amount of tokens to set for the player

+ * @param action

A description of the action performed

+ * @param pronoun

The pronoun to use for the action. Ex: if the action is "Added", the correct pronoun is "to"

+ */ + private void updateTokens(Player player, Player tokenPlayer, String name, int newTokens, String action, + String pronoun) { + TokensHelper.setTokens(player, newTokens); + MessageHelper.sendMessage(player, MessageKey.NORMAL_TOKENS_CHANGED, "option-" + action, + "%playerName%-" + tokenPlayer.getName(), "option2-" + pronoun, "amount-" + newTokens); + MessageHelper.sendMessage(tokenPlayer, MessageKey.NORMAL_TOKENS_CHANGED_PERSON, "option-" + + action.toLowerCase(), "%playerName%-" + name, "option2-" + pronoun, "amount-" + newTokens); + } + } diff --git a/src/main/java/net/knarcraft/blockhunt/config/MessageKey.java b/src/main/java/net/knarcraft/blockhunt/config/MessageKey.java index 2b77437..b712399 100644 --- a/src/main/java/net/knarcraft/blockhunt/config/MessageKey.java +++ b/src/main/java/net/knarcraft/blockhunt/config/MessageKey.java @@ -65,7 +65,7 @@ public enum MessageKey implements Key { NORMAL_IN_GAME_HIDERS_LEFT("%NHider(s) left: %A%left%%N", "normal.inGameHidersLeft"), NORMAL_IN_GAME_SEEKER_DIED("%TAG%NSeeker %A%%playerName%%%N died and will respawn in %A%seconds%%N" + "seconds!", "normal.inGameSeekerDied"), - normal_winSeekers("%TAG%NThe %ASEEKERS%N have won!", "normal.winSeekers"), + NORMAL_WIN_SEEKERS("%TAG%NThe %ASEEKERS%N have won!", "normal.winSeekers"), NORMAL_WIN_HIDERS("%TAG%NThe %AHIDERS%N have won!", "normal.winHiders"), NORMAL_SET_WARP_WARP_SET("%TAG%NSet warp '%A%warp%%N' to your location!", "normal.setWarpWarpSet"), NORMAL_ADDED_TOKEN("%TAG%A%amount%%N tokens were added to your account!", "normal.addedToken"), diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnBlockBreakEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnBlockBreakEvent.java index 39484c8..f24e65c 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnBlockBreakEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnBlockBreakEvent.java @@ -1,9 +1,6 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -13,16 +10,8 @@ public class OnBlockBreakEvent implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onBlockBreakEvent(BlockBreakEvent event) { - // Early exit if no one is in any arena - if (ArenaHandler.noPlayersInArenas()) { - return; - } - - Player player = event.getPlayer(); - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - event.setCancelled(true); - } + if (MemoryStorage.playerArena.get(event.getPlayer()) != null) { + event.setCancelled(true); } } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnBlockPlaceEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnBlockPlaceEvent.java index fec9a48..2a3595d 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnBlockPlaceEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnBlockPlaceEvent.java @@ -1,9 +1,6 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -13,16 +10,8 @@ public class OnBlockPlaceEvent implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onBlockPlaceEvent(BlockPlaceEvent event) { - // Early exit if no one is in any arena - if (ArenaHandler.noPlayersInArenas()) { - return; - } - - Player player = event.getPlayer(); - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - event.setCancelled(true); - } + if (MemoryStorage.playerArena.get(event.getPlayer()) != null) { + event.setCancelled(true); } } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageByEntityEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageByEntityEvent.java index 8f12ee2..a0f4538 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageByEntityEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageByEntityEvent.java @@ -3,13 +3,15 @@ package net.knarcraft.blockhunt.listener; import me.libraryaddict.disguise.DisguiseAPI; import net.knarcraft.blockhunt.BlockHunt; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.PlayerHandler; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.arena.ArenaState; import net.knarcraft.blockhunt.config.MessageKey; +import net.knarcraft.blockhunt.util.ArenaHelper; import net.knarcraft.blockhunt.util.MessageHelper; +import net.knarcraft.blockhunt.util.PlayerHelper; import net.knarcraft.blockhunt.util.StringHelper; +import net.knarcraft.blockhunt.util.TokensHelper; +import net.knarcraft.blockhunt.util.VisibilityHelper; import org.bukkit.GameMode; import org.bukkit.Sound; import org.bukkit.entity.Arrow; @@ -35,7 +37,7 @@ public class OnEntityDamageByEntityEvent implements Listener { } // Early exit if no one is in any arena - if (ArenaHandler.noPlayersInArenas()) { + if (ArenaHelper.noPlayersInArenas()) { return; } @@ -58,120 +60,130 @@ public class OnEntityDamageByEntityEvent implements Listener { return; } - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - if (arena.gameState == ArenaState.WAITING || arena.gameState == ArenaState.STARTING) { - // Always cancel damage when players are waiting + Arena arena = MemoryStorage.playerArena.get(player); + if (arena == null) { + return; + } + + if (arena.gameState == ArenaState.WAITING || arena.gameState == ArenaState.STARTING) { + // Always cancel damage when players are waiting + event.setCancelled(true); + return; + } + + // Seeker receiving damage + if (arena.seekers.contains(player)) { + if (arena.seekers.contains(damageDealer)) { + // Seeker damaged by seeker + if (!arena.seekersCanHurtSeekers) { + event.setCancelled(true); + return; + } + } else { + // Seeker damaged by hider + if (!arena.hidersCanHurtSeekers) { event.setCancelled(true); return; - } else { - // Seeker receiving damage - if (arena.seekers.contains(player)) { - if (arena.seekers.contains(damageDealer)) { - // Seeker damaged by seeker - if (!arena.seekersCanHurtSeekers) { - event.setCancelled(true); - return; - } - } else { - // Seeker damaged by hider - if (!arena.hidersCanHurtSeekers) { - event.setCancelled(true); - return; - } - } - } else { - // Hider damaged by hider - if (!arena.hidersCanHurtHiders && !arena.seekers.contains(damageDealer)) { - event.setCancelled(true); - return; - } - } - - // The damage is allowed, so lets handle it! - player.getWorld().playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); - - if (event.getDamage() >= player.getHealth()) { - player.setHealth(20); - event.setCancelled(true); - - // try moving everything to the next tick to prevent "Removing entity while ticking" errors - Player finalDamager = damageDealer; - player.getServer().getScheduler().runTask(BlockHunt.plugin, () -> { - DisguiseAPI.undisguiseToAll(player); - MemoryStorage.playerBlock.remove(player); - - if (!arena.seekers.contains(player)) { - if (MemoryStorage.shop.getFileConfiguration().get(finalDamager.getName() + ".tokens") == null) { - MemoryStorage.shop.getFileConfiguration().set(finalDamager.getName() + ".tokens", 0); - MemoryStorage.shop.save(); - } - int damagerTokens = MemoryStorage.shop.getFileConfiguration().getInt(finalDamager.getName() + ".tokens"); - MemoryStorage.shop.getFileConfiguration().set(finalDamager.getName() + ".tokens", damagerTokens + arena.killTokens); - MemoryStorage.shop.save(); - - MessageHelper.sendMessage(finalDamager, MessageKey.NORMAL_ADDED_TOKEN, "amount-" + arena.killTokens); - - if (MemoryStorage.shop.getFileConfiguration().get(player.getName() + ".tokens") == null) { - MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", 0); - MemoryStorage.shop.save(); - } - int playerTokens = MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".tokens"); - float addingTokens = ((float) arena.hidersTokenWin - (((float) arena.timer / (float) arena.gameTime) * (float) arena.hidersTokenWin)); - MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", playerTokens + (int) addingTokens); - MemoryStorage.shop.save(); - - MessageHelper.sendMessage(player, MessageKey.NORMAL_ADDED_TOKEN, "amount-" + (int) addingTokens); - - arena.seekers.add(player); - player.setWalkSpeed(0.3F); - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_HIDER_DIED, - "%playerName%-" + player.getDisplayName(), "killer-" + finalDamager.getDisplayName()); - - int hiderCount = (arena.playersInArena.size() - arena.seekers.size()); - if ((hiderCount <= 3) && (hiderCount > 0)) { - List hiders = new ArrayList<>(); - for (Player p : arena.playersInArena) { - if (!arena.seekers.contains(p)) { - hiders.add(p.getName()); - } - } - Collections.sort(hiders); - - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_HIDERS_LEFT, - "left-" + String.join(", ", - StringHelper.toString(hiders.toArray()))); - } else { - ArenaHandler.sendMessage(arena, MessageKey.NORMAL_IN_GAME_HIDERS_LEFT, - "left-" + hiderCount); - } - } - - player.getInventory().clear(); - - if (arena.seekers.size() >= arena.playersInArena.size()) { - ArenaHandler.seekersWin(arena); - } else { - DisguiseAPI.undisguiseToAll(player); - MemoryStorage.seekerTime.put(player, arena.waitingTimeSeeker); - PlayerHandler.teleport(player, arena.arenaLocations.getSeekersWarp()); - player.setGameMode(GameMode.SURVIVAL); - player.setWalkSpeed(0.3F); - - // Fix for client not showing players after they join - for (Player otherplayer : arena.playersInArena) { - if (otherplayer.canSee(player)) { - otherplayer.showPlayer(BlockHunt.plugin, player); // Make new player visible to others - } - if (player.canSee(otherplayer)) { - player.showPlayer(BlockHunt.plugin, otherplayer); // Make other players visible to new player - } - } - } - }); - } } } + } else { + // Hider damaged by hider + if (!arena.hidersCanHurtHiders && !arena.seekers.contains(damageDealer)) { + event.setCancelled(true); + return; + } + } + + // The damage is allowed, so lets handle it! + player.getWorld().playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); + + if (event.getDamage() < player.getHealth()) { + return; + } + + player.setHealth(20); + event.setCancelled(true); + + // try moving everything to the next tick to prevent "Removing entity while ticking" errors + Player finalDamageDealer = damageDealer; + player.getServer().getScheduler().runTask(BlockHunt.plugin, () -> { + killPlayer(arena, player, finalDamageDealer); + }); + } + + /** + * "Kills" a player in an arena + * + * @param arena

The arena the player is in

+ * @param player

The player to "kill"

+ * @param finalDamageDealer

The player that caused the last bit of damage

+ */ + private void killPlayer(Arena arena, Player player, Player finalDamageDealer) { + DisguiseAPI.undisguiseToAll(player); + MemoryStorage.playerBlock.remove(player); + + if (arena.hiders.contains(player)) { + killHider(arena, player, finalDamageDealer); + } + + player.getInventory().clear(); + + if (arena.seekers.size() >= arena.playersInArena.size()) { + ArenaHelper.seekersWin(arena); + } else { + DisguiseAPI.undisguiseToAll(player); + MemoryStorage.seekerTime.put(player, arena.waitingTimeSeeker); + PlayerHelper.teleport(player, arena.arenaLocations.getSeekersWarp()); + player.setGameMode(GameMode.SURVIVAL); + player.setWalkSpeed(0.3F); + + // Fix for client not showing players after they join + VisibilityHelper.makePlayerVisible(arena, player); } } + + /** + * "Kills" a hider in an arena + * + * @param arena

The arena the player is in

+ * @param player

The hider to "kill"

+ * @param finalDamageDealer

The player that caused the last bit of damage

+ */ + private void killHider(Arena arena, Player player, Player finalDamageDealer) { + int damageDealerTokens = TokensHelper.getTokens(finalDamageDealer); + TokensHelper.setTokens(finalDamageDealer, damageDealerTokens + arena.killTokens); + + MessageHelper.sendMessage(finalDamageDealer, MessageKey.NORMAL_ADDED_TOKEN, "amount-" + arena.killTokens); + + int playerTokens = TokensHelper.getTokens(player); + float addedTokens = ((float) arena.hidersTokenWin - (((float) arena.timer / (float) arena.gameTime) * + (float) arena.hidersTokenWin)); + TokensHelper.setTokens(player, playerTokens + (int) addedTokens); + + MessageHelper.sendMessage(player, MessageKey.NORMAL_ADDED_TOKEN, "amount-" + (int) addedTokens); + + arena.seekers.add(player); + player.setWalkSpeed(0.3F); + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_HIDER_DIED, + "%playerName%-" + player.getDisplayName(), "killer-" + finalDamageDealer.getDisplayName()); + + int hiderCount = arena.hiders.size(); + if ((hiderCount <= 3) && (hiderCount > 0)) { + List hiders = new ArrayList<>(); + for (Player p : arena.playersInArena) { + if (!arena.seekers.contains(p)) { + hiders.add(p.getName()); + } + } + Collections.sort(hiders); + + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_HIDERS_LEFT, + "left-" + String.join(", ", + StringHelper.toString(hiders.toArray()))); + } else { + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_HIDERS_LEFT, + "left-" + hiderCount); + } + } + } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageEvent.java index 1c4e241..c505b8b 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnEntityDamageEvent.java @@ -2,60 +2,43 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; -import org.bukkit.entity.Entity; 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.EntityDamageEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; public class OnEntityDamageEvent implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onEntityDamageEvent(EntityDamageEvent event) { - // Early exit if no one is in any arena - if (ArenaHandler.noPlayersInArenas()) { + if (!(event.getEntity() instanceof Player player)) { return; } - Entity ent = event.getEntity(); - if (ent instanceof Player) { - Player player = (Player) event.getEntity(); - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - DamageCause cause = event.getCause(); - switch (cause) { - case ENTITY_ATTACK: - case PROJECTILE: - // Do nothing about damage from an entity - // Any entity damage that makes it to here was already allowed by the EntityDamageByEntity event - break; - case FALL: - // Should we prevent the fall damage? - if (arena.seekers.contains(player)) { - if (!arena.seekersTakeFallDamage) { - // Prevent seeker fall damage (if configured) - event.setCancelled(true); - return; - } - } else { - if (!arena.hidersTakeFallDamage) { - // Prevent hider fall damage (if configured) - event.setCancelled(true); - return; - } - } - break; - default: - // Cancel all non-entity damage for all players (lava, drowning, fire, etc) - event.setCancelled(true); - break; - } - return; + Arena arena = MemoryStorage.playerArena.get(player); + if (arena == null) { + return; + } + + switch (event.getCause()) { + case ENTITY_ATTACK: + case PROJECTILE: + // Do nothing about damage from an entity + // Any entity damage that makes it to here was already allowed by the EntityDamageByEntity event + break; + case FALL: + // Prevent seeker/hider fall damage (if configured) + if ((arena.seekers.contains(player) && !arena.seekersTakeFallDamage) || + (arena.hiders.contains(player) && !arena.hidersTakeFallDamage)) { + event.setCancelled(true); } - } + break; + default: + // Cancel all non-entity damage for all players (lava, drowning, fire, etc) + event.setCancelled(true); + break; } } + } \ No newline at end of file diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnFoodLevelChangeEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnFoodLevelChangeEvent.java index 86592e3..95dacf3 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnFoodLevelChangeEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnFoodLevelChangeEvent.java @@ -1,7 +1,6 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.arena.Arena; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -12,12 +11,12 @@ public class OnFoodLevelChangeEvent implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onFoodLevelChangeEvent(FoodLevelChangeEvent event) { - Player player = (Player) event.getEntity(); + if (!(event.getEntity() instanceof Player player)) { + return; + } - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - event.setCancelled(true); - } + if (MemoryStorage.playerArena.get(player) != null) { + event.setCancelled(true); } } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryClickEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryClickEvent.java index 7f13389..75f80fb 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryClickEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryClickEvent.java @@ -1,12 +1,12 @@ package net.knarcraft.blockhunt.listener; -import net.knarcraft.blockhunt.InventoryHandler; import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.arena.ArenaProperty; import net.knarcraft.blockhunt.config.ConfigKey; import net.knarcraft.blockhunt.config.MessageKey; +import net.knarcraft.blockhunt.util.ArenaHelper; +import net.knarcraft.blockhunt.util.InventoryHelper; import net.knarcraft.blockhunt.util.MessageHelper; import net.knarcraft.blockhunt.util.StringHelper; import org.bukkit.Bukkit; @@ -27,10 +27,8 @@ public class OnInventoryClickEvent implements Listener { public void onInventoryClickEvent(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - event.setCancelled(true); - } + if (MemoryStorage.playerArena.get(player) != null) { + event.setCancelled(true); } Inventory inventory = event.getInventory(); @@ -93,7 +91,7 @@ public class OnInventoryClickEvent implements Listener { } } - InventoryHandler.openShop(player); + InventoryHelper.openShop(player); } else if (inventoryView.getTitle().contains(MessageHelper.replaceAll((String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME)))) { event.setCancelled(true); if (event.getCurrentItem() != null) { @@ -115,10 +113,9 @@ public class OnInventoryClickEvent implements Listener { for (Arena arena : MemoryStorage.arenaMap.values()) { if (arena.playersInArena.contains(player)) { for (Player playerCheck : arena.playersInArena) { - if (MemoryStorage.chosenSeeker.get(playerCheck) != null) { - if (MemoryStorage.chosenSeeker.get(playerCheck)) { - i = i + 1; - } + if (MemoryStorage.chosenSeeker.get(playerCheck) != null && + MemoryStorage.chosenSeeker.get(playerCheck)) { + i = i + 1; } } } @@ -208,11 +205,11 @@ public class OnInventoryClickEvent implements Listener { } save(arena); - InventoryHandler.openPanel(player, arena.arenaName); + InventoryHelper.openPanel(player, arena.arenaName); } else if (item.getType().equals(Material.BOOK)) { if (item.getItemMeta().getDisplayName().contains("disguiseBlocks")) { - InventoryHandler.openDisguiseBlocks(arena, player); + InventoryHelper.openDisguiseBlocks(arena, player); } } } @@ -221,7 +218,7 @@ public class OnInventoryClickEvent implements Listener { public void save(Arena arena) { MemoryStorage.arenas.getFileConfiguration().set(arena.arenaName, arena); MemoryStorage.arenas.save(); - ArenaHandler.loadArenas(); + ArenaHelper.loadArenas(); } public static void upDownButton(Player player, ItemStack item, Arena arena, ArenaProperty at, int option, int max, diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryCloseEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryCloseEvent.java index 53b3c15..243abac 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryCloseEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnInventoryCloseEvent.java @@ -2,7 +2,7 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; +import net.knarcraft.blockhunt.util.ArenaHelper; import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.Material; import org.bukkit.event.EventHandler; @@ -52,6 +52,6 @@ public class OnInventoryCloseEvent implements Listener { public void save(Arena arena) { MemoryStorage.arenas.getFileConfiguration().set(arena.arenaName, arena); MemoryStorage.arenas.save(); - ArenaHandler.loadArenas(); + ArenaHelper.loadArenas(); } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerDropItemEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerDropItemEvent.java index e5af850..367bc3c 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerDropItemEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerDropItemEvent.java @@ -1,7 +1,6 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.arena.Arena; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -14,10 +13,8 @@ public class OnPlayerDropItemEvent implements Listener { public void onPlayerDropItemEvent(PlayerDropItemEvent event) { Player player = event.getPlayer(); - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - event.setCancelled(true); - } + if (MemoryStorage.playerArena.get(player) != null) { + event.setCancelled(true); } } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerInteractEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerInteractEvent.java index 7e2028e..7a1a429 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerInteractEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerInteractEvent.java @@ -1,17 +1,17 @@ package net.knarcraft.blockhunt.listener; -import net.knarcraft.blockhunt.InventoryHandler; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.SignsHandler; -import net.knarcraft.blockhunt.SolidBlockHandler; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.arena.ArenaState; import net.knarcraft.blockhunt.config.ConfigKey; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.config.Permission; import net.knarcraft.blockhunt.manager.PermissionsManager; +import net.knarcraft.blockhunt.util.ArenaHelper; +import net.knarcraft.blockhunt.util.InventoryHelper; import net.knarcraft.blockhunt.util.MessageHelper; +import net.knarcraft.blockhunt.util.SignsHelper; +import net.knarcraft.blockhunt.util.VisibilityHelper; import net.md_5.bungee.api.ChatColor; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -39,86 +39,106 @@ public class OnPlayerInteractEvent implements Listener { public void onPlayerInteractEvent(PlayerInteractEvent event) { Player player = event.getPlayer(); Block block = event.getClickedBlock(); + + // Handle wand-usage if (PermissionsManager.hasPermission(player, Permission.CREATE, false)) { handleWandClick(event, player, block); } - if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock() != null && - event.getClickedBlock().getState() instanceof Sign sign && - SignsHandler.isSign(event.getClickedBlock().getLocation())) { + // Handle sign-clicking + if (event.getAction() == Action.RIGHT_CLICK_BLOCK && block != null && + block.getState() instanceof Sign sign && + SignsHelper.isSign(block.getLocation())) { handleSignClick(player, sign); + event.setCancelled(true); + return; } - if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK) { - if (event.getClickedBlock().getType() != Material.AIR) { - if (event.getClickedBlock().getType().equals(Material.ENCHANTING_TABLE) || event.getClickedBlock().getType().equals(Material.CRAFTING_TABLE) - || event.getClickedBlock().getType().equals(Material.FURNACE) || event.getClickedBlock().getType().equals(Material.CHEST) - || event.getClickedBlock().getType().equals(Material.ANVIL) || event.getClickedBlock().getType().equals(Material.ENDER_CHEST) - || event.getClickedBlock().getType().equals(Material.JUKEBOX) || block.getRelative(event.getBlockFace()).getType().equals(Material.FIRE)) { - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - event.setCancelled(true); - } - } - } - } - } - - if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK) { - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.seekers.contains(player)) { - for (Player pl : arena.playersInArena) { - if (MemoryStorage.hiddenLocation.get(pl) != null) { - Block pLoc = event.getClickedBlock(); - Block moveLocBlock = MemoryStorage.hiddenLocation.get(pl).getBlock(); - if (moveLocBlock.getX() == pLoc.getX() && moveLocBlock.getY() == pLoc.getY() && moveLocBlock.getZ() == pLoc.getZ()) { - MemoryStorage.moveLocation.put(pl, new Location(pl.getWorld(), 0, 0, 0)); - pl.getWorld().playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); - SolidBlockHandler.makePlayerUnsolid(pl); - } - } - } - } - } - } - - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player) && (arena.gameState.equals(ArenaState.WAITING) || arena.gameState.equals(ArenaState.STARTING))) { + // Block container or fire clicking + if ((event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK) && + block != null && !block.getType().isAir() && + (block.getType().isInteractable() || + block.getRelative(event.getBlockFace()).getType().equals(Material.FIRE))) { + if (MemoryStorage.playerArena.get(player) != null) { event.setCancelled(true); - ItemStack item = player.getInventory().getItemInMainHand(); - if (item.getType() != Material.AIR) { - if (item.getItemMeta().getDisplayName() != null) { - if (item.getItemMeta().getDisplayName().equals(MessageHelper.replaceAll((String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME)))) { - Inventory blockChooser = Bukkit.createInventory(null, 36, MessageHelper.replaceAll("\u00A7r" + MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME))); - if (arena.disguiseBlocks != null) { - for (int i = arena.disguiseBlocks.size(); i > 0; i = i - 1) { - blockChooser.setItem(i - 1, arena.disguiseBlocks.get(i - 1)); - } - } + } + } - player.openInventory(blockChooser); - } - - if (item.getItemMeta().getDisplayName().equals(MessageHelper.replaceAll((String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_NAME)))) { - Inventory BlockHuntPass = Bukkit.createInventory(null, 9, MessageHelper.replaceAll("\u00A7r" + MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_NAME))); - ItemStack BlockHuntPassSEEKER = new ItemStack(Material.BLUE_WOOL, 1); - ItemMeta BlockHuntPassIM = BlockHuntPassSEEKER.getItemMeta(); - BlockHuntPassIM.setDisplayName(MessageHelper.replaceAll("&eSEEKER")); - BlockHuntPassSEEKER.setItemMeta(BlockHuntPassIM); - BlockHuntPass.setItem(1, BlockHuntPassSEEKER); - - ItemStack BlockHuntPassHIDER = new ItemStack(Material.RED_WOOL, 1); - BlockHuntPassIM.setDisplayName(MessageHelper.replaceAll("&eHIDER")); - BlockHuntPassHIDER.setItemMeta(BlockHuntPassIM); - BlockHuntPass.setItem(7, BlockHuntPassHIDER); - - player.openInventory(BlockHuntPass); - } + // Handle seekers hitting solid hiders + if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK) { + // TODO: Do this more efficiently and directly, for example by mapping location vector to player instead of + // the other way around. + Arena arena = MemoryStorage.playerArena.get(event.getPlayer()); + if (arena != null && arena.seekers.contains(player)) { + for (Player arenaPlayer : arena.playersInArena) { + // Check all hidden players + if (MemoryStorage.hiddenLocation.get(arenaPlayer) == null) { + continue; } + + // Check if the player is hidden at the location hit + Block moveLocBlock = MemoryStorage.hiddenLocation.get(arenaPlayer).getBlock(); + if (block == null || moveLocBlock.getX() != block.getX() || moveLocBlock.getY() != block.getY() || + moveLocBlock.getZ() != block.getZ()) { + continue; + } + + // Make the hidden player no longer solid + MemoryStorage.moveLocation.put(arenaPlayer, new Location(arenaPlayer.getWorld(), 0, 0, 0)); + arenaPlayer.getWorld().playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); + VisibilityHelper.makePlayerUnSolid(arenaPlayer); } } } + Arena arena = MemoryStorage.playerArena.get(player); + if (arena == null) { + return; + } + + if (!arena.gameState.equals(ArenaState.WAITING) && !arena.gameState.equals(ArenaState.STARTING)) { + return; + } + + event.setCancelled(true); + ItemStack item = player.getInventory().getItemInMainHand(); + if (item.getType() == Material.AIR || item.getItemMeta() == null) { + return; + } + + item.getItemMeta().getDisplayName(); + if (item.getItemMeta().getDisplayName().equals(MessageHelper.replaceAll( + (String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME)))) { + Inventory blockChooser = Bukkit.createInventory(null, 36, + MessageHelper.replaceAll("\u00A7r" + MemoryStorage.config.get( + ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME))); + if (arena.disguiseBlocks != null) { + for (int i = arena.disguiseBlocks.size(); i > 0; i = i - 1) { + blockChooser.setItem(i - 1, arena.disguiseBlocks.get(i - 1)); + } + } + + player.openInventory(blockChooser); + } + + if (item.getItemMeta().getDisplayName().equals(MessageHelper.replaceAll( + (String) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_NAME)))) { + Inventory blockHuntPass = Bukkit.createInventory(null, 9, + MessageHelper.replaceAll("\u00A7r" + MemoryStorage.config.get( + ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_NAME))); + ItemStack blockHuntPassSEEKER = new ItemStack(Material.BLUE_WOOL, 1); + ItemMeta blockHuntPassItemMeta = blockHuntPassSEEKER.getItemMeta(); + blockHuntPassItemMeta.setDisplayName(MessageHelper.replaceAll("&eSEEKER")); + blockHuntPassSEEKER.setItemMeta(blockHuntPassItemMeta); + blockHuntPass.setItem(1, blockHuntPassSEEKER); + + ItemStack blockHuntPassHider = new ItemStack(Material.RED_WOOL, 1); + blockHuntPassItemMeta.setDisplayName(MessageHelper.replaceAll("&eHIDER")); + blockHuntPassHider.setItemMeta(blockHuntPassItemMeta); + blockHuntPass.setItem(7, blockHuntPassHider); + + player.openInventory(blockHuntPass); + } } private void handleSignClick(Player player, Sign sign) { @@ -127,19 +147,19 @@ public class OnPlayerInteractEvent implements Listener { if (signIdentifier.equals(MessageHelper.replaceAll( fileConfiguration.getStringList(ConfigKey.SIGN_LEAVE.getPath()).get(1)))) { if (PermissionsManager.hasPermission(player, Permission.JOIN_SIGN, true)) { - ArenaHandler.playerLeaveArena(player, true, true); + ArenaHelper.playerLeaveArena(player, true, true); } } else if (signIdentifier.equals(MessageHelper.replaceAll( fileConfiguration.getStringList(ConfigKey.SIGN_SHOP.getPath()).get(1)))) { if (PermissionsManager.hasPermission(player, Permission.SHOP, true)) { - InventoryHandler.openShop(player); + InventoryHelper.openShop(player); } } else { String cleanName = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', signIdentifier.toLowerCase())); Arena arena = MemoryStorage.arenaMap.get(cleanName); if (arena != null && PermissionsManager.hasPermission(player, Permission.JOIN_SIGN, true)) { - ArenaHandler.playerJoinArena(player, arena.arenaName); + ArenaHelper.playerJoinArena(player, arena.arenaName); } } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerMoveEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerMoveEvent.java index 232fbcf..dd036d3 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerMoveEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerMoveEvent.java @@ -1,12 +1,10 @@ package net.knarcraft.blockhunt.listener; -import net.knarcraft.blockhunt.BlockHunt; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.PlayerHandler; import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; import net.knarcraft.blockhunt.arena.ArenaLocations; import net.knarcraft.blockhunt.arena.ArenaState; +import net.knarcraft.blockhunt.util.PlayerHelper; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Sound; @@ -22,47 +20,25 @@ public class OnPlayerMoveEvent implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerMoveEvent(PlayerMoveEvent event) { - // Early exit if no one is in any arena - if (ArenaHandler.noPlayersInArenas()) { + Player player = event.getPlayer(); + Arena arena = MemoryStorage.playerArena.get(player); + + if (arena == null || arena.gameState != ArenaState.IN_GAME) { return; } - Player player = event.getPlayer(); - for (Arena arena : MemoryStorage.arenaMap.values()) { - //TODO: Optimize this to runtime O(1) - if (!arena.playersInArena.contains(player)) { - continue; - } - if (arena.gameState != ArenaState.IN_GAME) { - return; - } + // Store the location the player moved to for solid block mechanics + MemoryStorage.moveLocation.put(player, player.getLocation()); - ArenaLocations locations = arena.arenaLocations; - MemoryStorage.moveLocation.put(player, player.getLocation()); - if (locations.getCorner1() == null || locations.getCorner2() == null) { - BlockHunt.plugin.getLogger().info("Arena:" + - arena.arenaName + " appears to have bad coords : pos1:" + - ((locations.getCorner1() != null) ? locations.getCorner1().toString() : " NULL") + " Pos2:" + - ((locations.getCorner2() != null) ? locations.getCorner2().toString() : " NULL")); - BlockHunt.plugin.getLogger().info("Player has been returned to hiderswarp due to bad arena state"); - //event.setCancelled(true); - Location loc = player.getLocation(); - player.playEffect(loc, Effect.ENDER_SIGNAL, null); - player.playSound(loc, Sound.ENTITY_GHAST_SHOOT, 1, 1); - PlayerHandler.teleport(player, locations.getHidersWarp()); - return; - } - - // Force the player back in bounds if they are about to leave the arena - Location maxLocation = getRelativeLocation(locations.getCorner1(), locations.getCorner2(), Math::max); - Location minLocation = getRelativeLocation(locations.getCorner1(), locations.getCorner2(), Math::min); - Location playerLocation = player.getLocation(); - if (!areIntersecting(playerLocation, minLocation, maxLocation)) { - player.playEffect(playerLocation, Effect.ENDER_SIGNAL, null); - player.playSound(playerLocation, Sound.ENTITY_GHAST_SHOOT, 1, 1); - PlayerHandler.teleport(player, locations.getHidersWarp()); - } - return; + // Force the player back in bounds if they are about to leave the arena + ArenaLocations locations = arena.arenaLocations; + Location maxLocation = getRelativeLocation(locations.getCorner1(), locations.getCorner2(), Math::max); + Location minLocation = getRelativeLocation(locations.getCorner1(), locations.getCorner2(), Math::min); + Location playerLocation = player.getLocation(); + if (!areIntersecting(playerLocation, minLocation, maxLocation)) { + player.playEffect(playerLocation, Effect.ENDER_SIGNAL, null); + player.playSound(playerLocation, Sound.ENTITY_GHAST_SHOOT, 1, 1); + PlayerHelper.teleport(player, locations.getHidersWarp()); } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerQuitEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerQuitEvent.java index 5f4e3e2..adf42a1 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerQuitEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerQuitEvent.java @@ -1,8 +1,7 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; +import net.knarcraft.blockhunt.util.ArenaHelper; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -14,11 +13,8 @@ public class OnPlayerQuitEvent implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerQuitEvent(PlayerQuitEvent event) { Player player = event.getPlayer(); - - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - ArenaHandler.playerLeaveArena(player, true, true); - } + if (MemoryStorage.playerArena.get(player) != null) { + ArenaHelper.playerLeaveArena(player, true, true); } } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerSwapHandItemsEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerSwapHandItemsEvent.java index 402ffef..8a87dee 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerSwapHandItemsEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnPlayerSwapHandItemsEvent.java @@ -1,27 +1,18 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.MemoryStorage; -import net.knarcraft.blockhunt.arena.Arena; -import net.knarcraft.blockhunt.arena.ArenaHandler; -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.PlayerSwapHandItemsEvent; public class OnPlayerSwapHandItemsEvent implements Listener { + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerSwapHandItemsEvent(PlayerSwapHandItemsEvent event) { - // Early exit if no one is in any arena - if (ArenaHandler.noPlayersInArenas()) { - return; - } - - Player player = event.getPlayer(); - for (Arena arena : MemoryStorage.arenaMap.values()) { - if (arena.playersInArena.contains(player)) { - event.setCancelled(true); - } + if (MemoryStorage.playerArena.get(event.getPlayer()) != null) { + event.setCancelled(true); } } + } diff --git a/src/main/java/net/knarcraft/blockhunt/listener/OnSignChangeEvent.java b/src/main/java/net/knarcraft/blockhunt/listener/OnSignChangeEvent.java index 17ae367..9b69ac3 100644 --- a/src/main/java/net/knarcraft/blockhunt/listener/OnSignChangeEvent.java +++ b/src/main/java/net/knarcraft/blockhunt/listener/OnSignChangeEvent.java @@ -1,9 +1,9 @@ package net.knarcraft.blockhunt.listener; import net.knarcraft.blockhunt.BlockHunt; -import net.knarcraft.blockhunt.SignsHandler; import net.knarcraft.blockhunt.config.Permission; import net.knarcraft.blockhunt.manager.PermissionsManager; +import net.knarcraft.blockhunt.util.SignsHelper; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,7 +19,7 @@ public class OnSignChangeEvent implements Listener { if (lines[0] != null) { if (lines[0].equalsIgnoreCase("[" + BlockHunt.getPluginDescriptionFile().getName() + "]")) { if (PermissionsManager.hasPermission(player, Permission.SIGN_CREATE, true)) { - SignsHandler.createSign(event, lines, event.getBlock().getLocation()); + SignsHelper.createSign(event, lines, event.getBlock().getLocation()); } } } diff --git a/src/main/java/net/knarcraft/blockhunt/util/ArenaHelper.java b/src/main/java/net/knarcraft/blockhunt/util/ArenaHelper.java new file mode 100644 index 0000000..cfc8d07 --- /dev/null +++ b/src/main/java/net/knarcraft/blockhunt/util/ArenaHelper.java @@ -0,0 +1,570 @@ +package net.knarcraft.blockhunt.util; + +import me.libraryaddict.disguise.DisguiseAPI; +import net.knarcraft.blockhunt.BlockHunt; +import net.knarcraft.blockhunt.MemoryStorage; +import net.knarcraft.blockhunt.PlayerArenaData; +import net.knarcraft.blockhunt.arena.Arena; +import net.knarcraft.blockhunt.arena.ArenaLocations; +import net.knarcraft.blockhunt.arena.ArenaState; +import net.knarcraft.blockhunt.config.ConfigKey; +import net.knarcraft.blockhunt.config.MessageKey; +import net.knarcraft.blockhunt.config.Permission; +import net.knarcraft.blockhunt.event.EndArenaEvent; +import net.knarcraft.blockhunt.event.JoinArenaEvent; +import net.knarcraft.blockhunt.event.LeaveArenaEvent; +import net.knarcraft.blockhunt.manager.PermissionsManager; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.PotionEffect; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; + +/** + * A helper class for dealing with arenas + */ +public final class ArenaHelper { + + private ArenaHelper() { + + } + + /** + * Loads all arenas and creates scoreboards + */ + public static void loadArenas() { + MemoryStorage.arenaMap.clear(); + for (String arenaName : MemoryStorage.arenas.getFileConfiguration().getKeys(false)) { + MemoryStorage.arenaMap.put(arenaName.toLowerCase(), + (Arena) MemoryStorage.arenas.getFileConfiguration().get(arenaName)); + } + + for (Arena arena : MemoryStorage.arenaMap.values()) { + ScoreboardHelper.createScoreboard(arena); + } + } + + /** + * Sends a message to all players in an arena + * + * @param arena

The arena to announce to

+ * @param message

The message to display

+ * @param variables

The variables to replace in the message

+ */ + public static void sendMessage(Arena arena, String message, String... variables) { + MessageHelper.broadcastMessage(arena.playersInArena, message, variables); + } + + /** + * Sends a message to all players in an arena + * + * @param arena

The arena to announce to

+ * @param messageKey

The message key defining the string to display

+ * @param variables

The variables to replace in the message

+ */ + public static void sendMessage(Arena arena, MessageKey messageKey, String... variables) { + MessageHelper.broadcastMessage(arena.playersInArena, messageKey, variables); + } + + public static void playerJoinArena(Player player, String arenaName) { + if (MemoryStorage.playerArena.get(player) != null) { + MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_ALREADY_JOINED); + return; + } + + Arena arena = MemoryStorage.arenaMap.get(arenaName.toLowerCase()); + if (arena != null) { + // TODO: Use a disabled arena state instead of checking this condition every time + if (arena.disguiseBlocks.isEmpty()) { + MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_NO_BLOCKS_SET); + } else { + joinLobby(arena, player); + } + } else { + MessageHelper.sendMessage(player, MessageKey.ERROR_NO_ARENA, "name-" + arenaName); + } + + SignsHelper.updateSigns(); + } + + public static void playerLeaveArena(Player player, boolean message, boolean cleanup) { + Arena arena = MemoryStorage.playerArena.get(player); + if (arena == null) { + if (message) { + MessageHelper.sendMessage(player, MessageKey.ERROR_LEAVE_NOT_IN_ARENA); + } + return; + } + + BlockHunt.plugin.getLogger().log(Level.INFO, player.getName() + " has left " + arena.arenaName); + LeaveArenaEvent event = new LeaveArenaEvent(player, arena); + Bukkit.getPluginManager().callEvent(event); + + if (cleanup) { + cleanup(arena, player); + } + + PlayerArenaData playerArenaData = new PlayerArenaData(null, null, null, + null, null, null, null, null, null, + null, false); + + if (MemoryStorage.playerData.get(player) != null) { + playerArenaData = MemoryStorage.playerData.get(player); + } else { + BlockHunt.plugin.getLogger().log(Level.SEVERE, "Unable to find player data for " + player.getName() + + ". The player's state will be broken!"); + } + + player.getInventory().clear(); + player.getInventory().setContents(playerArenaData.playerInventory()); + player.getInventory().setArmorContents(playerArenaData.playerArmor()); + player.setExp(playerArenaData.playerEXP()); + player.setLevel(playerArenaData.playerEXPLevels()); + AttributeInstance healthAttribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); + if (healthAttribute != null) { + healthAttribute.setBaseValue(playerArenaData.playerMaxHealth()); + } + player.setHealth(playerArenaData.playerHealth()); + player.setFoodLevel(playerArenaData.playerFood()); + player.addPotionEffects(playerArenaData.playerPotionEffects()); + PlayerHelper.teleport(player, arena.arenaLocations.getExitWarp()); + player.setGameMode(playerArenaData.playerGameMode()); + player.setAllowFlight(playerArenaData.playerFlying()); + player.setFlying(playerArenaData.playerFlying()); + player.setWalkSpeed(0.2F); + + MemoryStorage.playerData.remove(player); + MemoryStorage.chosenBlock.remove(player); + + VisibilityHelper.makePlayerUnhidden(player); + + ScoreboardHelper.removeScoreboard(player); + + MessageHelper.sendMessage(player, MessageKey.NORMAL_LEAVE_YOU_LEFT); + if (message) { + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_LEAVE_LEFT_ARENA, "%playerName%-" + + player.getName(), "1-" + arena.playersInArena.size(), "2-" + arena.maxPlayers); + } + + SignsHelper.updateSigns(); + } + + private static void cleanup(Arena arena, Player player) { + arena.playersInArena.remove(player); + MemoryStorage.playerArena.remove(player); + arena.seekers.remove(player); + arena.hiders.remove(player); + MemoryStorage.playerArena.remove(player); + + if (arena.playersInArena.size() < arena.minPlayers && arena.gameState.equals(ArenaState.STARTING)) { + arena.gameState = ArenaState.WAITING; + arena.timer = 0; + + sendMessage(arena, MessageKey.WARNING_LOBBY_NEED_AT_LEAST, "1-" + arena.minPlayers); + } + + if (arena.playersInArena.size() <= 1 && arena.gameState == ArenaState.IN_GAME) { + if (arena.seekers.size() >= arena.playersInArena.size()) { + ArenaHelper.seekersWin(arena); + } else { + ArenaHelper.hidersWin(arena); + } + } + + if (arena.seekers.size() >= arena.playersInArena.size()) { + ArenaHelper.seekersWin(arena); + } + + if (arena.seekers.size() == 0 && arena.gameState == ArenaState.IN_GAME) { + Player seeker = arena.playersInArena.get(MemoryStorage.random.nextInt(arena.playersInArena.size())); + ArenaHelper.sendMessage(arena, MessageKey.WARNING_IN_GAME_NEW_SEEKER_CHOSEN, "seeker-" + seeker.getName()); + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_IN_GAME_SEEKER_CHOSEN, "seeker-" + seeker.getName()); + DisguiseAPI.undisguiseToAll(seeker); + for (Player pl : Bukkit.getOnlinePlayers()) { + pl.showPlayer(BlockHunt.plugin, seeker); + } + seeker.getInventory().clear(); + arena.seekers.add(seeker); + PlayerHelper.teleport(seeker, arena.arenaLocations.getSeekersWarp()); + MemoryStorage.seekerTime.put(seeker, arena.waitingTimeSeeker); + seeker.setWalkSpeed(0.3F); + + // Fix for client not showing players after they join + VisibilityHelper.makePlayerVisible(arena, player); + } + } + + /** + * Grants rewards to the seekers, and stops the arena + * + * @param arena

The arena in which the seekers won

+ */ + public static void seekersWin(Arena arena) { + String cause = "[BlockHunt] Seekers have won " + arena.arenaName; + rewardWinnersAndStop(arena, cause, arena.seekers, arena.seekersWinCommands, arena.seekersTokenWin, + MessageKey.NORMAL_WIN_SEEKERS); + } + + /** + * Grant rewards to the hiders, and stops the arena + * + * @param arena

The arena in which the hiders won

+ */ + public static void hidersWin(Arena arena) { + String cause = "[BlockHunt] Hiders have won " + arena.arenaName; + rewardWinnersAndStop(arena, cause, arena.hiders, arena.hidersWinCommands, arena.hidersTokenWin, + MessageKey.NORMAL_WIN_HIDERS); + } + + /** + * Rewards winners of an arena and stops the arena + * + * @param arena

The arena to grant rewards for

+ * @param cause

The cause of the arena stopping

+ * @param winnerTeam

The players on the team that won

+ * @param winCommands

The commands to be executed for the winning team

+ * @param winTokens

The amount of tokens to grant to the winners

+ * @param winMessage

The message to display to the players in the arena regarding which team won

+ */ + private static void rewardWinnersAndStop(Arena arena, String cause, List winnerTeam, + List winCommands, int winTokens, MessageKey winMessage) { + + List winners = new ArrayList<>(); + List losers = new ArrayList<>(); + + for (Player player : arena.playersInArena) { + if (winnerTeam.contains(player)) { + winners.add(player); + grantRewards(player, winCommands, winTokens); + } else { + losers.add(player); + } + } + + // Stop the arena + stopArena(arena, winners, losers, cause, winMessage); + } + + /** + * Stops an arena + * + * @param arena

The arena to stop

+ * @param winners

The winners of the arena

+ * @param losers

The losers of the arena

+ * @param cause

The cause of why the arena was stopped

+ * @param message

The message to display to players

+ */ + private static void stopArena(Arena arena, List winners, List losers, String cause, + MessageKey message) { + EndArenaEvent event = new EndArenaEvent(winners, losers, arena); + Bukkit.getServer().getPluginManager().callEvent(event); + stopArena(arena, cause, message); + } + + /** + * Grant arena win rewards to a player + * + * @param player

The player to reward

+ * @param winCommands

The commands to execute upon winning

+ * @param tokens

The amount of tokens to grant

+ */ + private static void grantRewards(Player player, List winCommands, int tokens) { + + // Execute any hiders win commands + if (winCommands != null) { + for (String command : winCommands) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.replaceAll("%player%", + player.getDisplayName())); + } + } + + // Give the player their tokens + int playerTokens = TokensHelper.getTokens(player); + TokensHelper.setTokens(player, playerTokens + tokens); + + MessageHelper.sendMessage(player, MessageKey.NORMAL_ADDED_TOKEN, "amount-" + tokens); + } + + /** + * Stops an arena + * + * @param arena

The arena to stop

+ * @param cause

A description of why the arena was stopped

+ * @param message

The message to display to affected players

+ */ + public static void stopArena(Arena arena, String cause, MessageKey message) { + BlockHunt.plugin.getLogger().log(Level.INFO, cause); + ArenaHelper.sendMessage(arena, message); + arena.seekers.clear(); + arena.hiders.clear(); + + for (Player player : arena.playersInArena) { + playerLeaveArena(player, false, false); + MemoryStorage.playerArena.remove(player); + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 1); + } + + arena.gameState = ArenaState.WAITING; + arena.timer = 0; + arena.playersInArena.clear(); + } + + /** + * Checks whether any arena has any player + * + * @return

True if all arenas are empty

+ */ + public static boolean noPlayersInArenas() { + // Check if there are any players in any arena (quick way to early exit for event handlers) + for (Arena arena : MemoryStorage.arenaMap.values()) { + if (arena.playersInArena.size() > 0) { + return false; + } + } + return true; + } + + /** + * Makes the given player join the given arena's lobby + * + * @param arena

The arena the player wants to join

+ * @param player

The player that's joining the arena

+ */ + private static void joinLobby(Arena arena, Player player) { + // Deny the player if their inventory needs to be empty, and it's not + if ((Boolean) MemoryStorage.config.get(ConfigKey.REQUIRE_INVENTORY_CLEAR_ON_JOIN) && !isInventoryEmpty(player)) { + MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_INVENTORY_NOT_EMPTY); + return; + } + + // Check that the arena has been properly set up before allowing the player to play + // TODO: It would be better to have a DISABLED state for arenas until they are properly set up. + ArenaLocations locations = arena.arenaLocations; + if (!areWarpsSet(locations, player.getWorld())) { + MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_WARPS_NOT_SET); + return; + } + + // Make sure the game isn't already running + if (arena.gameState == ArenaState.IN_GAME) { + MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_ARENA_IN_GAME); + return; + } + + // Check if the arena is already full + if (arena.playersInArena.size() >= arena.maxPlayers && + !PermissionsManager.hasPermission(player, Permission.JOIN_FULL, false)) { + MessageHelper.sendMessage(player, MessageKey.ERROR_JOIN_FULL); + return; + } + + // Teleport the player to the arena + boolean canWarp = PlayerHelper.teleport(player, locations.getLobbyWarp()); + if (!canWarp) { + MessageHelper.sendMessage(player, MessageKey.ERROR_TELEPORT_FAILED); + return; + } + + BlockHunt.plugin.getLogger().log(Level.INFO, player.getName() + " has joined " + arena.arenaName); + arena.playersInArena.add(player); + MemoryStorage.playerArena.put(player, arena); + // Call the join event for any add-ons + Bukkit.getPluginManager().callEvent(new JoinArenaEvent(player, arena)); + + AttributeInstance healthAttribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + // Store the player's data for restoration later + PlayerArenaData playerArenaData = new PlayerArenaData(player.getLocation(), player.getGameMode(), + player.getInventory().getContents(), player.getInventory().getArmorContents(), player.getExp(), + player.getLevel(), healthAttribute != null ? healthAttribute.getValue() : 20, player.getHealth(), + player.getFoodLevel(), player.getActivePotionEffects(), player.getAllowFlight()); + MemoryStorage.playerData.put(player, playerArenaData); + + // Set the player's state to the desired state + setArenaState(arena, player, healthAttribute); + + // Fix for client not showing players after they join + VisibilityHelper.makePlayerVisible(arena, player); + + // Give the player access to the block chooser + giveBlockChooser(player); + + // Give the player access to the hider/seeker chooser + giveHiderSeekerChooser(player); + + // Remove any existing disguise + DisguiseAPI.undisguiseToAll(player); + + // Announce that the player joined + ArenaHelper.sendMessage(arena, MessageKey.NORMAL_JOIN_JOINED_ARENA, "%playerName%-" + player.getName(), + "1-" + arena.playersInArena.size(), "2-" + arena.maxPlayers); + if (arena.playersInArena.size() < arena.minPlayers) { + // Announce that additional players are required for the arena to start + sendMessage(arena, MessageKey.WARNING_LOBBY_NEED_AT_LEAST, "1-" + arena.minPlayers); + } + } + + /** + * Gives a hider/seeker chooser to the given player if necessary + * + * @param player

The player to give the hider/seeker chooser to

+ */ + private static void giveHiderSeekerChooser(Player player) { + // If not enabled, return + if (!((Boolean) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_ENABLED))) { + return; + } + + // If the player is out of passes, don't give them the choice between hider and seeker + if (MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".blockhuntpass") <= 0) { + return; + } + + Material chooserMaterial = Material.matchMaterial((String) MemoryStorage.config.get( + ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_ID_NAME)); + if (chooserMaterial == null) { + BlockHunt.plugin.getLogger().log(Level.SEVERE, "Cannot give the block chooser because an invalid" + + " material has been set."); + return; + } + ItemStack shopBlockHuntPass = new ItemStack(chooserMaterial, 1); + ItemMeta shopBlockHuntPassItemMeta = shopBlockHuntPass.getItemMeta(); + if (shopBlockHuntPassItemMeta == null) { + return; + } + shopBlockHuntPassItemMeta.setDisplayName(MessageHelper.replaceAll((String) MemoryStorage.config.get( + ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_NAME))); + List loreStrings = MemoryStorage.config.getFileConfiguration().getStringList( + ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_DESCRIPTION.getPath()); + List loreStrings2 = new ArrayList<>(); + for (String lore : loreStrings) { + loreStrings2.add(MessageHelper.replaceAll(lore)); + } + + shopBlockHuntPassItemMeta.setLore(loreStrings2); + shopBlockHuntPass.setItemMeta(shopBlockHuntPassItemMeta); + shopBlockHuntPass.setAmount(MemoryStorage.shop.getFileConfiguration().getInt( + player.getName() + ".blockhuntpass")); + + player.getInventory().addItem(shopBlockHuntPass); + } + + /** + * Gives a block chooser to the given player if necessary + * + * @param player

The player to give the block chooser to

+ */ + private static void giveBlockChooser(Player player) { + // If missing the necessary permission or if it's disabled, abort + if (!((Boolean) MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_ENABLED)) || + (MemoryStorage.shop.getFileConfiguration().get(player.getName() + ".blockchooser") == null && + !PermissionsManager.hasPermission(player, Permission.SHOP_BLOCK_CHOOSER, false))) { + return; + } + + Material chooserMaterial = Material.matchMaterial((String) MemoryStorage.config.get( + ConfigKey.SHOP_BLOCK_CHOOSER_V_1_ID_NAME)); + if (chooserMaterial == null) { + BlockHunt.plugin.getLogger().log(Level.SEVERE, "Cannot give the block chooser because an invalid" + + " material has been set."); + return; + } + + ItemStack shopBlockChooser = new ItemStack(chooserMaterial, 1); + ItemMeta shopBlockChooserItemMeta = shopBlockChooser.getItemMeta(); + if (shopBlockChooserItemMeta == null) { + return; + } + shopBlockChooserItemMeta.setDisplayName(MessageHelper.replaceAll((String) MemoryStorage.config.get( + ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME))); + List loreStrings = MemoryStorage.config.getFileConfiguration().getStringList( + ConfigKey.SHOP_BLOCK_CHOOSER_V_1_DESCRIPTION.getPath()); + List loreStrings2 = new ArrayList<>(); + for (String loreLine : loreStrings) { + loreStrings2.add(MessageHelper.replaceAll(loreLine)); + } + shopBlockChooserItemMeta.setLore(loreStrings2); + shopBlockChooser.setItemMeta(shopBlockChooserItemMeta); + + player.getInventory().addItem(shopBlockChooser); + } + + /** + * Sets the player's state to the arena's required state + * + *

Sets food and health to defaults, and clears the inventory among other things.

+ * + * @param arena

The arena the player joined

+ * @param player

The player to update the state for

+ * @param healthAttribute

The player's health attribute

+ */ + private static void setArenaState(Arena arena, Player player, AttributeInstance healthAttribute) { + player.setGameMode(GameMode.SURVIVAL); + for (PotionEffect potionEffect : player.getActivePotionEffects()) { + player.removePotionEffect(potionEffect.getType()); + } + player.setFoodLevel(20); + player.setHealth(20); + + if (healthAttribute != null) { + healthAttribute.setBaseValue(20); + } + player.setLevel(arena.timer); + player.setExp(0); + player.getInventory().clear(); + player.getInventory().setHelmet(new ItemStack(Material.AIR)); + player.getInventory().setChestplate(new ItemStack(Material.AIR)); + player.getInventory().setLeggings(new ItemStack(Material.AIR)); + player.getInventory().setBoots(new ItemStack(Material.AIR)); + player.setFlying(false); + player.setAllowFlight(false); + player.setWalkSpeed(0.2F); + } + + /** + * Checks whether the given player's inventory is completely empty + * + * @param player

The player to check

+ * @return

True if the player's inventory is completely empty

+ */ + private static boolean isInventoryEmpty(Player player) { + for (ItemStack inventoryItem : player.getInventory()) { + if (inventoryItem != null && inventoryItem.getType() != Material.AIR) { + return false; + } + } + for (ItemStack inventoryItem : player.getInventory().getArmorContents()) { + if (inventoryItem != null && inventoryItem.getType() != Material.AIR) { + return false; + } + } + return true; + } + + /** + * Checks whether all warps are set in the given ArenaLocations object + * + * @param locations

The arena locations to check

+ * @param world

The world the arena belongs to

+ * @return

True if all warps have been properly set

+ */ + private static boolean areWarpsSet(ArenaLocations locations, World world) { + Location zero = new Location(world, 0, 0, 0, 0, 0); + return locations.getLobbyWarp() != null && locations.getHidersWarp() != null && + locations.getSeekersWarp() != null && locations.getExitWarp() != null && + !locations.getLobbyWarp().equals(zero) && !locations.getHidersWarp().equals(zero) && + !locations.getSeekersWarp().equals(zero) && !locations.getExitWarp().equals(zero); + } + +} diff --git a/src/main/java/net/knarcraft/blockhunt/InventoryHandler.java b/src/main/java/net/knarcraft/blockhunt/util/InventoryHelper.java similarity index 92% rename from src/main/java/net/knarcraft/blockhunt/InventoryHandler.java rename to src/main/java/net/knarcraft/blockhunt/util/InventoryHelper.java index 1ea6b3c..d695eda 100644 --- a/src/main/java/net/knarcraft/blockhunt/InventoryHandler.java +++ b/src/main/java/net/knarcraft/blockhunt/util/InventoryHelper.java @@ -1,12 +1,12 @@ -package net.knarcraft.blockhunt; +package net.knarcraft.blockhunt.util; +import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; import net.knarcraft.blockhunt.arena.ArenaProperty; import net.knarcraft.blockhunt.config.ConfigKey; import net.knarcraft.blockhunt.config.MessageKey; import net.knarcraft.blockhunt.config.Permission; import net.knarcraft.blockhunt.manager.PermissionsManager; -import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -17,7 +17,11 @@ import org.bukkit.inventory.meta.ItemMeta; import java.util.ArrayList; import java.util.List; -public class InventoryHandler { +public final class InventoryHelper { + + private InventoryHelper() { + + } public static void openPanel(Player player, String arenaName) { @@ -183,23 +187,19 @@ public class InventoryHandler { public static void openShop(Player player) { Inventory shop = Bukkit.createInventory(null, 9, MessageHelper.replaceAll("\u00A7r" + MemoryStorage.config.get(ConfigKey.SHOP_TITLE))); - if (MemoryStorage.shop.getFileConfiguration().get(player.getName() + ".tokens") == null) { - MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", 0); - MemoryStorage.shop.save(); - } - int playerTokens = MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".tokens"); + int playerTokens = TokensHelper.getTokens(player); List loreLines; List loreLines2; ItemStack shopTokens = new ItemStack(Material.EMERALD, 1); - ItemMeta shopTokens_IM = shopTokens.getItemMeta(); - shopTokens_IM.setDisplayName(MessageHelper.replaceAll("%N&lTokens: %A" + playerTokens)); - shopTokens.setItemMeta(shopTokens_IM); + ItemMeta shopTokensItemMeta = shopTokens.getItemMeta(); + shopTokensItemMeta.setDisplayName(MessageHelper.replaceAll("%N&lTokens: %A" + playerTokens)); + shopTokens.setItemMeta(shopTokensItemMeta); ItemStack shopBlockChooser = new ItemStack(Material.getMaterial((String) MemoryStorage.config.get( ConfigKey.SHOP_BLOCK_CHOOSER_V_1_ID_NAME)), 1); - ItemMeta shopBlockChooser_IM = shopBlockChooser.getItemMeta(); - shopBlockChooser_IM.setDisplayName(MessageHelper.replaceAll((String) MemoryStorage.config.get( + ItemMeta shopBlockChooserItemMeta = shopBlockChooser.getItemMeta(); + shopBlockChooserItemMeta.setDisplayName(MessageHelper.replaceAll((String) MemoryStorage.config.get( ConfigKey.SHOP_BLOCK_CHOOSER_V_1_NAME))); loreLines = MemoryStorage.config.getFileConfiguration().getStringList(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_DESCRIPTION.getPath()); loreLines2 = new ArrayList<>(); @@ -210,8 +210,8 @@ public class InventoryHandler { loreLines2.add(MessageHelper.replaceAll((String) MemoryStorage.config.get(ConfigKey.SHOP_PRICE), "amount-" + MemoryStorage.config.get(ConfigKey.SHOP_BLOCK_CHOOSER_V_1_PRICE))); - shopBlockChooser_IM.setLore(loreLines2); - shopBlockChooser.setItemMeta(shopBlockChooser_IM); + shopBlockChooserItemMeta.setLore(loreLines2); + shopBlockChooser.setItemMeta(shopBlockChooserItemMeta); ItemStack shopBlockHuntPass = new ItemStack(Material.getMaterial((String) MemoryStorage.config.get( ConfigKey.SHOP_BLOCK_HUNT_PASS_V_2_ID_NAME)), 1); diff --git a/src/main/java/net/knarcraft/blockhunt/PlayerHandler.java b/src/main/java/net/knarcraft/blockhunt/util/PlayerHelper.java similarity index 61% rename from src/main/java/net/knarcraft/blockhunt/PlayerHandler.java rename to src/main/java/net/knarcraft/blockhunt/util/PlayerHelper.java index 6285bdb..703807e 100644 --- a/src/main/java/net/knarcraft/blockhunt/PlayerHandler.java +++ b/src/main/java/net/knarcraft/blockhunt/util/PlayerHelper.java @@ -1,11 +1,18 @@ -package net.knarcraft.blockhunt; +package net.knarcraft.blockhunt.util; +import net.knarcraft.blockhunt.MemoryStorage; import org.bukkit.Location; import org.bukkit.entity.Player; -public class PlayerHandler { +public final class PlayerHelper { + + private PlayerHelper() { + + } + public static boolean teleport(Player player, Location location) { MemoryStorage.teleportLocation.put(player, location); return player.teleport(location); } + } diff --git a/src/main/java/net/knarcraft/blockhunt/ScoreboardHandler.java b/src/main/java/net/knarcraft/blockhunt/util/ScoreboardHelper.java similarity index 94% rename from src/main/java/net/knarcraft/blockhunt/ScoreboardHandler.java rename to src/main/java/net/knarcraft/blockhunt/util/ScoreboardHelper.java index 31fb40d..14caa64 100644 --- a/src/main/java/net/knarcraft/blockhunt/ScoreboardHandler.java +++ b/src/main/java/net/knarcraft/blockhunt/util/ScoreboardHelper.java @@ -1,9 +1,10 @@ -package net.knarcraft.blockhunt; +package net.knarcraft.blockhunt.util; +import net.knarcraft.blockhunt.BlockHunt; +import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; import net.knarcraft.blockhunt.arena.ArenaState; import net.knarcraft.blockhunt.config.ConfigKey; -import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scoreboard.Criteria; @@ -12,7 +13,12 @@ import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Score; import org.bukkit.scoreboard.Scoreboard; -public class ScoreboardHandler { +public final class ScoreboardHelper { + + private ScoreboardHelper() { + + } + public static void createScoreboard(Arena arena) { if ((Boolean) MemoryStorage.config.get(ConfigKey.SCOREBOARD_ENABLED)) { Scoreboard board = arena.scoreboard; @@ -85,4 +91,5 @@ public class ScoreboardHandler { public static void removeScoreboard(Player player) { player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); } + } diff --git a/src/main/java/net/knarcraft/blockhunt/SignsHandler.java b/src/main/java/net/knarcraft/blockhunt/util/SignsHelper.java similarity index 97% rename from src/main/java/net/knarcraft/blockhunt/SignsHandler.java rename to src/main/java/net/knarcraft/blockhunt/util/SignsHelper.java index 9295330..9ed5170 100644 --- a/src/main/java/net/knarcraft/blockhunt/SignsHandler.java +++ b/src/main/java/net/knarcraft/blockhunt/util/SignsHelper.java @@ -1,10 +1,10 @@ -package net.knarcraft.blockhunt; +package net.knarcraft.blockhunt.util; +import net.knarcraft.blockhunt.MemoryStorage; import net.knarcraft.blockhunt.arena.Arena; import net.knarcraft.blockhunt.arena.ArenaState; import net.knarcraft.blockhunt.config.ConfigKey; import net.knarcraft.blockhunt.config.MessageKey; -import net.knarcraft.blockhunt.util.MessageHelper; import org.bukkit.Location; import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; @@ -12,7 +12,11 @@ import org.bukkit.event.block.SignChangeEvent; import java.util.List; -public class SignsHandler { +public final class SignsHelper { + + private SignsHelper() { + + } public static void createSign(SignChangeEvent event, String[] lines, Location location) { if (lines[1] != null) { diff --git a/src/main/java/net/knarcraft/blockhunt/util/StringHelper.java b/src/main/java/net/knarcraft/blockhunt/util/StringHelper.java index b06e08f..448e4d3 100644 --- a/src/main/java/net/knarcraft/blockhunt/util/StringHelper.java +++ b/src/main/java/net/knarcraft/blockhunt/util/StringHelper.java @@ -1,5 +1,8 @@ package net.knarcraft.blockhunt.util; +/** + * A helper class for common string modification actions + */ public final class StringHelper { private StringHelper() { diff --git a/src/main/java/net/knarcraft/blockhunt/util/TokensHelper.java b/src/main/java/net/knarcraft/blockhunt/util/TokensHelper.java new file mode 100644 index 0000000..1741624 --- /dev/null +++ b/src/main/java/net/knarcraft/blockhunt/util/TokensHelper.java @@ -0,0 +1,49 @@ +package net.knarcraft.blockhunt.util; + +import net.knarcraft.blockhunt.MemoryStorage; +import org.bukkit.entity.Player; + +/** + * A helper class for dealing with a player's tokens + */ +public final class TokensHelper { + + private TokensHelper() { + + } + + /** + * Sets the amount of tokens for the given player + * + * @param player

The player to set tokens for

+ * @param tokens

The amount of tokens to set

+ */ + public static void setTokens(Player player, int tokens) { + MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", tokens); + MemoryStorage.shop.save(); + } + + /** + * Gets a player's current tokens + * + * @param player

The player to get tokens for

+ * @return

The player's current tokens

+ */ + public static int getTokens(Player player) { + initializeTokens(player); + return MemoryStorage.shop.getFileConfiguration().getInt(player.getName() + ".tokens"); + } + + /** + * Makes sure the given player's tokens is initialized and not null + * + * @param player

The player whose tokens should be initialized

+ */ + private static void initializeTokens(Player player) { + if (MemoryStorage.shop.getFileConfiguration().get(player.getName() + ".tokens") == null) { + MemoryStorage.shop.getFileConfiguration().set(player.getName() + ".tokens", 0); + MemoryStorage.shop.save(); + } + } + +} diff --git a/src/main/java/net/knarcraft/blockhunt/util/VisibilityHelper.java b/src/main/java/net/knarcraft/blockhunt/util/VisibilityHelper.java new file mode 100644 index 0000000..599ba19 --- /dev/null +++ b/src/main/java/net/knarcraft/blockhunt/util/VisibilityHelper.java @@ -0,0 +1,194 @@ +package net.knarcraft.blockhunt.util; + +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.MiscDisguise; +import net.knarcraft.blockhunt.BlockHunt; +import net.knarcraft.blockhunt.MemoryStorage; +import net.knarcraft.blockhunt.arena.Arena; +import net.knarcraft.blockhunt.config.MessageKey; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Objects; +import java.util.logging.Level; + +import static net.knarcraft.blockhunt.util.StringHelper.uppercaseAllFirst; + +/** + * A helper class for editing player visibility + */ +public final class VisibilityHelper { + + private VisibilityHelper() { + + } + + /** + * Makes a player visible to players in an arena and the other way around + * + * @param arena

The arena the player was in

+ * @param player

The player to make visible

+ */ + public static void makePlayerVisible(Arena arena, Player player) { + for (Player otherPlayer : arena.playersInArena) { + if (otherPlayer.canSee(player)) { + // Make player visible to others + otherPlayer.showPlayer(BlockHunt.plugin, player); + } + if (player.canSee(otherPlayer)) { + // Make other players visible to player + player.showPlayer(BlockHunt.plugin, otherPlayer); + } + } + } + + /** + * Makes a hidden player in an arena no longer appear as hidden + * + *

This should be used when a player leaves an arena or the server to make sure no remnants of the hidden block + * remains

+ * + * @param player

The player to un-hide

+ */ + public static void makePlayerUnhidden(Player player) { + // Un-disguise the player + DisguiseAPI.undisguiseToAll(player); + + // Get the block data for the player + BlockData hiddenBlockData = null; + if (MemoryStorage.hiddenLocationMaterial.get(player) != null) { + hiddenBlockData = Bukkit.createBlockData(MemoryStorage.hiddenLocationMaterial.get(player)); + } + + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + // Make the player visible to other players + onlinePlayer.showPlayer(BlockHunt.plugin, player); + + // No longer display the player's solid block + if (hiddenBlockData != null) { + Block playerBlock = MemoryStorage.hiddenLocation.get(player).getBlock(); + onlinePlayer.sendBlockChange(playerBlock.getLocation(), hiddenBlockData); + } + } + } + + /** + * Makes the player into a no longer solid block + * + * @param player

The player to make unsolid

+ */ + public static void makePlayerUnSolid(Player player) { + ItemStack block = player.getInventory().getItem(8); + if (block == null) { + // This shouldn't be possible, but just in case + player.sendMessage(ChatColor.RED + "Unable to hide you because your inventory block is missing!"); + BlockHunt.plugin.getLogger().log(Level.SEVERE, player.getName() + " could not be hidden because " + + "their inventory block was missing!"); + return; + } + + Block playerBlock = player.getLocation().getBlock(); + if (MemoryStorage.hiddenLocation.get(player) != null) { + playerBlock = MemoryStorage.hiddenLocation.get(player).getBlock(); + } + + block.setAmount(5); + for (Player otherPlayer : Bukkit.getOnlinePlayers()) { + if (otherPlayer.equals(player)) { + continue; + } + + // Restore the block the player replaced + Material material = MemoryStorage.hiddenLocationMaterial.get(player); + otherPlayer.sendBlockChange(playerBlock.getLocation(), + Bukkit.createBlockData(Objects.requireNonNullElse(material, Material.AIR))); + MemoryStorage.hiddenLocationMaterial.remove(player); + } + + player.playSound(player.getLocation(), Sound.ENTITY_BAT_HURT, 1, 1); + block.removeEnchantment(Enchantment.DURABILITY); + + for (Player playerShow : Bukkit.getOnlinePlayers()) { + playerShow.showPlayer(BlockHunt.plugin, player); + } + + MiscDisguise disguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, block.getType()); + DisguiseAPI.disguiseToAll(player, disguise); + + MessageHelper.sendMessage(player, MessageKey.NORMAL_IN_GAME_NO_MORE_SOLID); + } + + /** + * Tries to make the given player solid + * + * @param player

The player to make solid

+ * @param solidBlock

The block to solidify the player as

+ */ + public static void makePlayerSolid(Player player, ItemStack solidBlock) { + Block playerBlock = player.getLocation().getBlock(); + BlockData playerBlockData = playerBlock.getBlockData(); + if (playerBlockData.getMaterial().isAir() || !playerBlockData.getMaterial().isSolid()) { + makePlayerSolid(player, playerBlock, playerBlockData, solidBlock, player.getLocation()); + } else { + MessageHelper.sendMessage(player, MessageKey.WARNING_IN_GAME_NO_SOLID_PLACE); + } + } + + /** + * Makes a player into a perceived solid block + * + * @param player

The player to make solid

+ * @param playerBlock

The block the player is currently standing at

+ * @param playerBlockData

The data of the block the player is currently standing at

+ * @param inventoryBlock

The inventory block which corresponds to the player's hide material

+ * @param playerLocation

The current location of the player

+ */ + private static void makePlayerSolid(Player player, Block playerBlock, BlockData playerBlockData, ItemStack inventoryBlock, + Location playerLocation) { + // Store the material the player replaced + MemoryStorage.hiddenLocationMaterial.put(player, playerBlockData.getMaterial()); + + if (DisguiseAPI.isDisguised(player)) { + // Hide the player, and make all other players see a full block in the player's location + DisguiseAPI.undisguiseToAll(player); + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + if (!onlinePlayer.equals(player)) { + onlinePlayer.hidePlayer(BlockHunt.plugin, player); + onlinePlayer.sendBlockChange(playerBlock.getLocation(), + inventoryBlock.getType().createBlockData()); + } + } + + inventoryBlock.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + player.playSound(playerLocation, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + // Store the location the player is hidden at + MemoryStorage.hiddenLocation.put(player, playerLocation); + + // Announce to the player that they are now hidden + String blockName = inventoryBlock.getType().name(); + blockName = uppercaseAllFirst(blockName.replace("_", " ")); + MessageHelper.sendMessage(player, MessageKey.NORMAL_IN_GAME_NOW_SOLID, "block-" + + blockName); + } + + for (Player otherPlayer : Bukkit.getOnlinePlayers()) { + if (otherPlayer.equals(player)) { + continue; + } + + // Hide the player and update the perceived + otherPlayer.hidePlayer(BlockHunt.plugin, player); + otherPlayer.sendBlockChange(playerBlock.getLocation(), inventoryBlock.getType().createBlockData()); + } + } + +}