[Urgent] Sign help

Discussion in 'Plugin Development' started by ItsLeoFTW, Jul 31, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    ItsLeoFTW

    Hi,

    I recently made a thread asking for help with minigame events, but now I've decided to do a tutorial minigame first (one from a tutorial).

    There's one problem I'm having though... Signs that are used to join games are not updating!
    (Here's what I mean)
    - Player 1 joins Arena #2.
    - Player 2 looks at sign for Arena #2, and even though a player has joined that arena, the player count still says 0.
    - When the game starts, well, the "status" on the sign is supposed to change from "[WAITING]" to "[STARTED]". This is not happening for some reason.

    I heard that there are issues with the update() method for signs... so here's the code I'm using:
    (WARNING: Code is long!)
    (SignManager class)

    Code:
    package net.minerzone.minigames.magicwars.listeners;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import net.minerzone.minigames.magicwars.Arena;
    import net.minerzone.minigames.magicwars.Arena.ArenaState;
    import net.minerzone.minigames.magicwars.ArenaManager;
    import net.minerzone.minigames.magicwars.LocationUtil;
    import net.minerzone.minigames.magicwars.MagicWars;
    import net.minerzone.minigames.magicwars.MessageManager;
    import net.minerzone.minigames.magicwars.MessageManager.MessageType;
    import net.minerzone.minigames.magicwars.SettingsManager;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.block.Sign;
    import org.bukkit.configuration.ConfigurationSection;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.block.SignChangeEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
     
    public class SignManager implements Listener {
     
        private static HashMap<Sign, Integer> signs = new HashMap<Sign, Integer>();
     
        public SignManager() {
     
            if (!SettingsManager.getLobbySigns().contains("signs")) {
                SettingsManager.getLobbySigns().createConfigurationSection("signs");
            }
     
            for (String str : SettingsManager.getLobbySigns().<ConfigurationSection>get("signs").getKeys(true)) {
                ConfigurationSection section = SettingsManager.getLobbySigns().get("signs." + str);
     
                Location loc = LocationUtil.locationFromConfig(section.getConfigurationSection("location"), false);
                            if (loc != null){
                                if (loc.getBlock() != null){
                                    if (loc.getBlock().getState() instanceof Sign){
                                        final Sign s = (Sign) loc.getBlock().getState();
                                        s.update(true);
                                        signs.put(s, section.getInt("arenaNumber"));
                                    }
                                }
                            }
            }
        }
     
        public static ArrayList<Sign> getSigns(Arena a) {
            ArrayList<Sign> s = new ArrayList<Sign>();
     
            for (Sign sign : signs.keySet()) {
                if (ArenaManager.getInstance().getArena(signs.get(sign)) == a) s.add(sign);
            }
     
            return s;
        }
     
        @EventHandler
        public void onSignChange(SignChangeEvent e) {
            if (e.getLine(0).equalsIgnoreCase(ChatColor.translateAlternateColorCodes('&', "&1[MagicWars]"))) {
                int id;
                try { id = Integer.parseInt(e.getLine(1)); }
                catch (Exception ex) { MessageManager.getInstance().msg(e.getPlayer(), MessageType.BAD, "That is not a valid arena ID!"); return; }
     
                Arena a = ArenaManager.getInstance().getArena(id);
                if (a == null) {
                    MessageManager.getInstance().msg(e.getPlayer(), MessageType.BAD, "That is not a valid arena!");
                    return;
                }
     
                ConfigurationSection section = SettingsManager.getLobbySigns().createConfigurationSection("signs." + SettingsManager.getLobbySigns().<ConfigurationSection>get("signs").getKeys(true).size() + 1);
     
                ConfigurationSection location = section.createSection("location");
                location.set("world", e.getBlock().getLocation().getWorld().getName());
                location.set("x", e.getBlock().getLocation().getX());
                location.set("y", e.getBlock().getLocation().getY());
                location.set("z", e.getBlock().getLocation().getZ());
     
                section.set("arenaNumber", id);
     
                signs.put((Sign) e.getBlock().getState(), a.getID());
     
                //e.setLine(2, a.getCurrentPlayers() + " Players");
                //e.setLine(3, a.getState().toString());
    //                        if (a.getState() == ArenaState.STARTED){
    //                            e.setLine(0, ChatColor.translateAlternateColorCodes('&', "&c&l[STARTED]"));
    //                        } else {
    //                            if (a.getState() == ArenaState.COUNTING_DOWN){
    //                                e.setLine(0, ChatColor.translateAlternateColorCodes('&', "&9&l[COUNTING]"));
    //                            } else {
    //                                if (a.getState() == ArenaState.DISABLED){
    //                                    e.setLine(0, ChatColor.translateAlternateColorCodes('&', "&4&l[DISABLED]"));
    //                                } else {
    //                                    if (a.getState() == ArenaState.WAITING){
    //                                        e.setLine(0, ChatColor.translateAlternateColorCodes('&', "&a&l[WAITING]"));
    //                                    } else {
    //                                      if (a.getCurrentPlayers() == a.getMaxPlayers()){
    //                                          e.setLine(0, ChatColor.translateAlternateColorCodes('&', "&e&l[FULL]"));
    //                                      }
    //                                    }
    //                                }
    //                            }
    //                        }
                            //e.setLine(2, a.getCurrentPlayers() + " Players");
                            String plural = "";
                            if (a.getMaxPlayers() == 1) plural = " Slot"; else plural = " Slots";
                            String started = "&a&l[STARTED]";
                            String disabled = "&c&l[DISABLED]";
                            String counting_down = "&9&l[STARTING]";
                            String waiting = "&a&l[WAITING]";
                            String full = "&4&l[FULL]";
                            e.setLine(2, ChatColor.translateAlternateColorCodes('&', "&c&l" + a.getCurrentPlayers() + " / " + a.getMaxPlayers() + plural));
                            e.getBlock().getState().update(true);
                            //e.setLine(3, a.getState().toString());
                            if (a.getState() == ArenaState.STARTED){
                                e.setLine(3, ChatColor.translateAlternateColorCodes('&', started));
                                e.getBlock().getState().update();
                                e.getBlock().getState().update(true);
                            } else {
                                if (a.getState() == ArenaState.COUNTING_DOWN){
                                    e.setLine(3, ChatColor.translateAlternateColorCodes('&', counting_down));
                                    e.getBlock().getState().update();
                                    e.getBlock().getState().update(true);
                                } else {
                                    if (a.getState() == ArenaState.DISABLED){
                                        e.setLine(3, ChatColor.translateAlternateColorCodes('&', disabled));
                                        e.getBlock().getState().update();
                                        e.getBlock().getState().update(true);
                                    } else {
                                        if (a.getState() == ArenaState.WAITING){
                                            e.setLine(3, ChatColor.translateAlternateColorCodes('&', waiting));
                                            e.getBlock().getState().update();
                                            e.getBlock().getState().update(true);
                                        } else {
                                            if (a.isFull()){
                                                e.setLine(3, ChatColor.translateAlternateColorCodes('&', full));
                                                e.getBlock().getState().update();
                                                e.getBlock().getState().update(true);
                                            }
                                        }
                                    }
                                }
                            }
                            e.getBlock().getState().update();
                            e.getBlock().getState().update(true);
            }
        }
     
        @EventHandler
        public void onPlayerInteract(PlayerInteractEvent e) {
            if (!(e.getAction() == Action.RIGHT_CLICK_AIR) && !(e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
     
            if (e.getClickedBlock() == null || e.getClickedBlock().getState() == null) return;
     
            if (e.getClickedBlock().getState() instanceof Sign) {
                Sign s = (Sign) e.getClickedBlock().getState();
                if (s.getLine(0).equalsIgnoreCase(ChatColor.translateAlternateColorCodes('&', "&1[MagicWars]"))) {
                                    if (ArenaManager.getInstance().getArena(e.getPlayer()) == null){
                                        ArenaManager.getInstance().getArena(Integer.parseInt(s.getLine(1))).addPlayer(e.getPlayer());
                                        MessageManager.getInstance().msg(e.getPlayer(), MessageType.GOOD, "You have joined the arena!");
                                        s.update();
                                        s.update(true);
                                        return;
                                    } else {
                                        e.setCancelled(true);
                                        MessageManager.getInstance().msg(e.getPlayer(), MessageType.BAD, "You are already playing in an arena!");
                                        return;
                                    }
                }
            }
        }
    }
    Arena class:

    Code:
    package net.minerzone.minigames.magicwars;
     
    import java.util.ArrayList;
    import java.util.Random;
    import java.util.logging.Logger;
    import net.minerzone.minigames.magicwars.MessageManager.MessageType;
    import net.minerzone.minigames.magicwars.listeners.SignManager;
     
     
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.block.Block;
    import org.bukkit.block.Sign;
    import org.bukkit.configuration.ConfigurationSection;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.scheduler.BukkitRunnable;
     
    public class Arena {
     
        public enum ArenaState { DISABLED, WAITING, COUNTING_DOWN, STARTED, FULL; }
     
        private int id, numPlayers, currentPlayers;
        private ArrayList<PlayerData> data;
        private ArrayList<Sign> signs;
        private Location spawnPoint;
        protected ArenaState state = ArenaState.DISABLED;
     
        protected Arena(int id) {
            this.id = id;
            this.data = new ArrayList<PlayerData>();
            this.numPlayers = SettingsManager.getArenas().get("arenas." + id + ".numPlayers");
            if (SettingsManager.getArenas().contains("arenas." + id + ".spawn")) {
                ConfigurationSection s = SettingsManager.getArenas().get("arenas." + id + ".spawn");
                spawnPoint = LocationUtil.locationFromConfig(s, true);
            }
     
            state = ArenaState.WAITING;
     
            this.signs = SignManager.getSigns(this);
                 
        }
     
        public int getID() {
            return id;
        }
     
        public ArenaState getState() {
                return state;
        }
     
        public int getCurrentPlayers() {
            return currentPlayers;
        }
            public int getMaxPlayers(){
                return numPlayers;
            }
     
        public void addPlayer(Player p) {
                 
            if (currentPlayers >= numPlayers) {
                MessageManager.getInstance().msg(p, MessageType.BAD, "There are too many players.");
                return;
            }
     
            if (spawnPoint == null) {
                MessageManager.getInstance().msg(p, MessageType.BAD, "Spawn point not yet set.");
                return;
            }
     
            data.add(new PlayerData(p));
     
            p.getInventory().clear();
                    p.updateInventory();
            p.getInventory().addItem(Wand.values()[new Random().nextInt(Wand.values().length)].createItemStack());
                    p.updateInventory();
            p.teleport(spawnPoint);
                    String plural = " Slots";
                    if (ArenaManager.getInstance().getArena(id) != null){
                        if (ArenaManager.getInstance().getArena(id).getMaxPlayers() == 1) plural = " Slot";
                        currentPlayers++;
     
                        for (final Sign s : signs) {
                s.setLine(2, ChatColor.translateAlternateColorCodes('&', "&c&l" + ArenaManager.getInstance().getArena(id).getCurrentPlayers() + " / " + ArenaManager.getInstance().getArena(id).getMaxPlayers() + plural));
                            ((Block)s).getState().update(true);
                        }
                    }
        }
     
        public void removePlayer(Player p) {
                    if (ArenaManager.getInstance().getArena(p) != null){
            PlayerData d = getPlayerData(p);
            d.restorePlayer();
            data.remove(d);
                    return;
                    }
                    String plural = " Slots";
                 
                    if (ArenaManager.getInstance().getArena(id).getMaxPlayers() == 1) plural = " Slot";
            currentPlayers--;
     
            for (Sign s : signs) {
                //s.setLine(2, currentPlayers + "");
                            s.setLine(2, ChatColor.translateAlternateColorCodes('&', "&c&l" + currentPlayers + " / " + ArenaManager.getInstance().getArena(id).getMaxPlayers() + plural));
                ((Block)s).getState().update(true);
                         
            }
     
            if (currentPlayers == 1) {
                stop(data.get(0).getPlayer());
            } else if (currentPlayers == 0) {
                            stop();
                    }
        }
            public boolean isFull(){
                return currentPlayers >= numPlayers;
            }
         
     
        public void start() {
            this.state = ArenaState.COUNTING_DOWN;
    //        for (Sign s : signs) {
    //            s.setLine(3, getState().toString());
    //            s.update(true);
    //        }
                 
            new Countdown(
                                 
                    60,
                    "Game starting in %t %operator!",
                    this,
                                    50,
                                    40,
                    30,
                    20,
                                    15,
                    10,
                                    9,
                                    8,
                                    7,
                                    6,
                    5,
                    4,
                    3,
                    2,
                    1
            ).runTaskTimer(MagicWars.getPlugin(), 0, 20);
        }
     
        public void stop(Player winner) {
            if (winner != null) {
                        MessageManager.getInstance().broadcast(MessageType.GOOD, winner.getName() + " has won arena " + id + "!");
                        TokenAPI.giveMoney(winner, 200);
                        MessageManager.getInstance().msg(winner, MessageType.INFO, "You have received 200 Tokens for winning.");
                    }
            for (PlayerData pd : data) pd.restorePlayer();
     
            this.state = ArenaState.WAITING;
        }
     
        public void stop() {
            MessageManager.getInstance().broadcast(MessageType.GOOD, "The arena " + id + " has ended!");
     
            for (PlayerData pd : data) pd.restorePlayer();
     
            this.state = ArenaState.WAITING;
        }
     
        public boolean containsPlayer(Player p) {
            return getPlayerData(p) != null;
        }
     
        private PlayerData getPlayerData(Player p) {
            for (PlayerData d : data) {
                if (d.isForPlayer(p)) return d;
            }
            return null;
        }
     
        protected void sendMessage(MessageType type, String... messages) {
            for (PlayerData d : data) MessageManager.getInstance().msg(d.getPlayer(), type, messages);
        }
     
        private class Countdown extends BukkitRunnable {
     
            private int timer;
            private String msg;
            private Arena a;
            private ArrayList<Integer> countingNums;
     
            public Countdown(int start, String msg, Arena a, int... countingNums) {
                this.timer = start;
                this.msg = msg;
                this.a = a;
                this.countingNums = new ArrayList<Integer>();
                for (int i : countingNums) this.countingNums.add(i);
            }
     
            public void run() {
                if (timer == 0 ) {
                    for (PlayerData pd : data) {
                                        if (pd != null) {
                        pd.getPlayer().teleport(spawnPoint);
                                        }
                    }
     
                    MessageManager.getInstance().broadcast(MessageType.GOOD, "The game has started!");
                    a.state = ArenaState.STARTED;
                    cancel();
                }
     
                if (countingNums.contains(timer)) {
                                    String timeType = (timer == 1 ? "second" : "seconds");
                                    if (timer > 59) timeType = (timer == 60 ? "minute" : "minutes");
                                    if (timer > 59 * 60) timeType = (timer == 59 * 60 ? "hour" : "hours");
                    MessageManager.getInstance().broadcast(MessageType.INFO, msg.replace("%t", timer + "").replace("%operator", timeType));
                }
     
                timer--;
            }
        }
    }
     
    class PlayerData {
     
        private Player puu;
        private String playerName;
        private ItemStack[] contents, armorContents;
        private Location location;
     
        protected PlayerData(Player puu) {
                this.puu = puu;
            this.playerName = puu.getName();
            this.contents = puu.getInventory().getContents();
            this.armorContents = puu.getInventory().getArmorContents();
            this.location = puu.getLocation();
        }
     
        protected Player getPlayer() {
                    if (puu != null){
                        Logger logger = MagicWars.getPlugin().getLogger();
                        logger.info("UUID of " + puu.getName() + " is: " + puu.getUniqueId());
                        return Bukkit.getServer().getPlayer(puu.getUniqueId());
                    }
                    return null;
        }
     
        protected void restorePlayer() {
                try {
            Player p = Bukkit.getServer().getPlayer(puu.getUniqueId());
                    if (p != null){
                        p.getInventory().setContents(contents);
                        p.updateInventory();
                        p.getInventory().setArmorContents(armorContents);
                        p.updateInventory();
                        p.teleport(location);
                     
                     
                    }
                } catch (Exception ex){
                    //MessageManager.getInstance().msg(puu, MessageType.BAD, "An exception occurred.");
                    return;
                }
        }
     
        protected boolean isForPlayer(Player p) {
            return playerName.equalsIgnoreCase(p.getName());
        }
    }
     
  2. Offline

    ChipDev

    Not sign.update(boolean), because it could be sign.update(false), so use sign.update(); maybe.
     
Thread Status:
Not open for further replies.

Share This Page