package me.maker56.survivalgames.sign; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import me.maker56.survivalgames.Util; import me.maker56.survivalgames.SurvivalGames; import me.maker56.survivalgames.commands.messages.MessageHandler; import me.maker56.survivalgames.game.Game; import me.maker56.survivalgames.game.GameState; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; public class SignManager { private String[] design = new String[4]; private String[] leaveDesign = new String[4]; private HashMap<Location, String> signs = new HashMap<>(); private HashMap<GameState, String> translations = new HashMap<>(); private boolean arena, playersleft; public SignManager() { reload(); } public void reload() { FileConfiguration c = SurvivalGames.signs; for(int i = 1; i <= 4; i++) { design[i - 1] = ChatColor.translateAlternateColorCodes('&', c.getString("Sign.Line." + i)); } arena = c.getBoolean("Sign.LeftClick.Show current arena"); playersleft = c.getBoolean("Sign.LeftClick.Show players remain"); leaveDesign[0] = ChatColor.translateAlternateColorCodes('&', c.getString("Sign.LeavePrefix")); for(int i = 2; i <= 4; i++) { leaveDesign[i - 1] = ChatColor.translateAlternateColorCodes('&', c.getString("Sign.Leave.Line." + i)); } for(String key : c.getConfigurationSection("Translations.").getKeys(false)) { translations.put(GameState.valueOf(key), ChatColor.translateAlternateColorCodes('&', c.getString("Translations." + key))); } List<String> s = c.getStringList("Sign.List"); int a = 0; for(String key : s) { String[] split = key.split(":"); Location loc = Util.parseLocation(split[0]); if(loc != null) { signs.put(loc, split[1]); } a++; } System.out.println("[SurvivalGames] " + a + " signs loaded!"); } public void addSign(Player p, final Location loc, final String lobby) { if(!signs.containsKey(loc)) { List<String> signs = SurvivalGames.signs.getStringList("Sign.List"); signs.add(Util.serializeLocation(loc, false) + ":" + lobby); SurvivalGames.signs.set("Sign.List", signs); SurvivalGames.saveSigns(); this.signs.put(loc, lobby); Bukkit.getScheduler().scheduleSyncDelayedTask(SurvivalGames.instance, new Runnable() { public void run() { updateSign(loc, lobby); } }, 1L); p.sendMessage(MessageHandler.getMessage("prefix") + "You've created the join sign successfully!"); } } public boolean isSign(Location loc) { return signs.containsKey(loc); } public void removeSign(Player p, Location loc) { if(signs.containsKey(loc)) { String lobby = signs.get(loc); this.signs.remove(loc); List<String> signs = SurvivalGames.signs.getStringList("Sign.List"); signs.remove(Util.serializeLocation(loc, false) + ":" + lobby); SurvivalGames.signs.set("Sign.List", signs); SurvivalGames.saveSigns(); p.sendMessage(MessageHandler.getMessage("prefix") + "You've removed the join sign successfully!"); } } public String[] getLeaveSignDesign() { return leaveDesign; } public String getLobby(Location loc) { if(signs.containsKey(loc)) return signs.get(loc); return null; } public void sendInfo(CommandSender sender, String lobby) { Game g = SurvivalGames.gameManager.getGame(lobby); if(g != null) { sender.sendMessage(MessageHandler.getMessage("game-sign-info").replace("%0%", lobby)); if(g.getState() == GameState.INGAME || g.getState() == GameState.DEATHMATCH || g.getState() == GameState.COOLDOWN) { if(arena) sender.sendMessage(MessageHandler.getMessage("game-sign-arena").replace("%0%", g.getCurrentArena().getName())); if(playersleft) { String s = g.getAlivePlayers(); sender.sendMessage(MessageHandler.getMessage("game-sign-playersleft").replace("%1%", s).replace("%0%", Integer.valueOf(g.getPlayingUsers()).toString())); } } else { sender.sendMessage(MessageHandler.getMessage("game-sign-noinfo")); } } else { sender.sendMessage(MessageHandler.getMessage("join-unknown-game").replace("%0%", lobby)); } } public void updateSigns() { for(Entry<Location, String> s : signs.entrySet()) { Location loc = s.getKey(); if(loc != null && loc.getWorld() != null) { updateSign(loc, s.getValue()); } } } public void updateSign(Location loc, String lobby) { Block b = loc.getBlock(); if(b.getType() == Material.SIGN_POST || b.getType() == Material.WALL_SIGN) { Sign s = (Sign) b.getState(); Game g = SurvivalGames.gameManager.getGame(lobby); if(g != null) { String state = translations.get(g.getState()); for(int i = 0; i < 4; i++) { s.setLine(i, design[i].replace("%name%", g.getName()).replace("%state%", state).replace("%currentplayers%", Integer.valueOf(g.getPlayingUsers()).toString()).replace("%requiredplayers%", Integer.valueOf(g.getRequiredPlayers()).toString()).replace("%maxplayers%", Integer.valueOf(g.getMaximumPlayers()).toString())); } s.update(); } else { if(SurvivalGames.database.contains("Games." + lobby)) { s.setLine(1, "�4Game not"); s.setLine(2, "�4loaded!"); } else { s.setLine(1, "�4Game not"); s.setLine(2, "�4found!"); } s.update(); } } } }