Solved Some ifs aren't running.

Discussion in 'Plugin Development' started by VinexAx789, Jun 18, 2016.

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

    VinexAx789

    Problem: I had this problem before but I fixed it I do not remember how I did. I stupidly replaced the method with the old one after I fixed it and I completely ruined the ending of my game. I screwed myself I'm a week before I'm releasing the game and I ruined it. It had nothing to do with teamsleft == 1 last time I fixed it but here's the code below. Also here's the link to the old thread of mine: https://bukkit.org/threads/help-ifs-not-running.403895/#post-3323477 Now mods you can remove that thread if you want but this is not a duplicate that was solved I just forgot to label it but now I screwed up and copied the old method and replaced it with the new one that worked. If you guys can please help me with this that would be amazing and much appreciated.

    Variables:
    Code:
    public ArrayList<String> attackers = new ArrayList<String>();
        public static ArrayList<String> defenders = new ArrayList<String>();
        public ArrayList<String> teamsleft = new ArrayList<String>();
    
        public int attackersleft = 0;
        public int defendersleft = 0;
    CODE:
    Code:
        public void updatescoreonQuit(final Player p) {
    
            Bukkit.getScheduler().runTaskLater(this, new Runnable() {
    
                public void run() {
    
                    if (attackers.contains(p.getName())) {
                        attackersleft = attackersleft - 1;
                        attackers.remove(p.getName());
                        attackerScore.setScore(attackers.size());
    
                    }
                    if (defenders.contains(p.getName())) {
                        defendersleft = defendersleft - 1;
                        defenders.remove(p.getName());
                        defenderScore.setScore(defenders.size());
                    }
                    if (attackers.size() == 0) {
                        teamsleft.remove("attackers");
                    }
                    if (defenders.size() == 0) {
                        teamsleft.remove("defenders");
                    }
    
                    if (teamsleft.size() == 1) {
                        if (teamsleft.get(0).equalsIgnoreCase("attackers")) {
                            endGame.gameOver(0, p);
                        }
                        if (teamsleft.get(0).equalsIgnoreCase("defenders")) {
                            endGame.gameOver(1, p);
                        }
                    }
                }
    
            }, 10);
            Bukkit.getScheduler().runTaskLater(this, new Runnable() {
    
                public void run() {
    
                    attackerScore.setScore(attackers.size());
                    defenderScore.setScore(defenders.size());
    
                }
            }, 20);
    
        }
    
     
  2. Offline

    I Al Istannen

    @VinexAx789
    I didn't look at the code, but eclipse at least saves the history. Right click on the file (in the navigator or packge explorer) and select "Compare With" and then "Local history". There you can view any changes.
     
  3. Offline

    VinexAx789

    @I Al Istannen You're a life saver! But I found out where I jacked it up at it's in the quit Event.

    Code:
    @SuppressWarnings("static-access")
    
        @EventHandler
        public void onQuitGame(PlayerQuitEvent event) {
            Player p = (Player) event.getPlayer();
    
            plugin.players.remove(p);
    
            if (plugin.presidentPlayer.contains(p.getName())) {
                plugin.endGame.gameOver(0, p);
                Bukkit.broadcastMessage(plugin.prefix + Bukkit.getPlayer(plugin.presidentPlayer).getName()
                        + " has rage quit! Game over...");
            } else if (plugin.gstate == GameState.ENDED) {
    
            }
    
            event.setQuitMessage(null);
            event.setQuitMessage(plugin.prefix + p.getName() + " has quit the game! " + C.dgray + "(" + C.aqua
                    + plugin.players.size() + C.dgray + "" + C.aqua + plugin.maxplayers + C.dgray + ")");
            if (plugin.gstate == GameState.INGAME) {
                event.setQuitMessage(null);
            }
    
            plugin.updatescoreonQuit(p);
    
            if (Bukkit.getOnlinePlayers().size() == 1) {
                Bukkit.getScheduler().cancelAllTasks();
                plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                    public void run() {
    
                        Bukkit.getServer().unloadWorld(plugin.attackerspawn.getWorld(), false);
                    }
                }, 10L);
                plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                    public void run() {
                        Bukkit.getServer().reload();
                    }
                }, 20L);
            } else {
                if (!(plugin.gstate == GameState.ENDED)) {
                    if (plugin.players.contains(p)) {
                        if (!(plugin.gstate == GameState.INGAME)) {
                            plugin.players.remove(p.getPlayer());
                            plugin.spectators.remove(p.getName());
                            if (plugin.attackers.contains(p.getName())) {
                                plugin.attackers.remove(p.getName());
                                plugin.removeRed(p);
                            }
                            if (plugin.defenders.contains(p.getName())) {
                                plugin.defenders.remove(p.getName());
                                plugin.removeBlue(p);
                            }
                        } else {
                            plugin.spectators.add(p.getName());
                            plugin.players.remove(p);
                            plugin.updatescoreonQuit(p);
                            if (plugin.attackers.contains(p.getName())) {
                                plugin.attackers.remove(p.getName());
                                plugin.removeRed(p);
                            }
                            if (plugin.defenders.contains(p.getName())) {
                                plugin.defenders.remove(p.getName());
                                plugin.removeBlue(p);
                            }
                        }
                    }
    
                }
    
            }
        }
    My error is somewhere in here I need it to make it so the team that left will lose then the team that still has 1 left wins.

    Code:
    if (Bukkit.getOnlinePlayers().size() == 1) {
                Bukkit.getScheduler().cancelAllTasks();
                plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                    public void run() {
    
                        Bukkit.getServer().unloadWorld(plugin.attackerspawn.getWorld(), false);
                    }
                }, 10L);
                plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                    public void run() {
                        Bukkit.getServer().reload();
                    }
                }, 20L);
            } else {
                if (!(plugin.gstate == GameState.ENDED)) {
                    if (plugin.players.contains(p)) {
                        if (!(plugin.gstate == GameState.INGAME)) {
                            plugin.players.remove(p.getPlayer());
                            plugin.spectators.remove(p.getName());
                            if (plugin.attackers.contains(p.getName())) {
                                plugin.attackers.remove(p.getName());
                                plugin.removeRed(p);
                            }
                            if (plugin.defenders.contains(p.getName())) {
                                plugin.defenders.remove(p.getName());
                                plugin.removeBlue(p);
                            }
                        } else {
                            plugin.spectators.add(p.getName());
                            plugin.players.remove(p);
                            plugin.updatescoreonQuit(p);
                            if (plugin.attackers.contains(p.getName())) {
                                plugin.attackers.remove(p.getName());
                                plugin.removeRed(p);
                            }
                            if (plugin.defenders.contains(p.getName())) {
                                plugin.defenders.remove(p.getName());
                                plugin.removeBlue(p);
                            }
                        }
                    }
    
                }
    
            }
    It used to not do this but now it is:
    PHP:
    18.06 05:57:11 [DisconnectUser Vinex_ has disconnectedreasonDisconnected
    18.06 05
    :57:12 [ServerINFO Defenders win!
    18.06 05:57:12 [ServerWARN Task #731 for DTP v1.0 generated an exception
    18.06 05:57:12 [ServerINFO java.lang.NullPointerException
    18.06 05
    :57:12 [ServerINFO at com.venomsurge.dtp.game.EndGame.gameOver(EndGame.java:106) ~[?:?]
    18.06 05:57:12 [ServerINFO at com.venomsurge.dtp.DTP$3.run(DTP.java:502) ~[?:?]
    18.06 05:57:12 [ServerINFO at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot45.jar:git-Spigot-5f38d38-12698ea]
    18.06 05:57:12 [ServerINFO at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot45.jar:git-Spigot-5f38d38-12698ea]
    18.06 05:57:12 [ServerINFO at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:723) [spigot45.jar:git-Spigot-5f38d38-12698ea]
    18.06 05:57:12 [ServerINFO at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot45.jar:git-Spigot-5f38d38-12698ea]
    18.06 05:57:12 [ServerINFO at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot45.jar:git-Spigot-5f38d38-12698ea]
    18.06 05:57:12 [ServerINFO at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot45.jar:git-Spigot-5f38d38-12698ea]
    18.06 05:57:12 [ServerINFO at java.lang.Thread.run(Thread.java:745) [?:1.8.0_66]
    18.06 05:57:15 [ServerINFO CONSOLE issued server command: /list 
    LINE 106:
    Code:
    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Loser reward: 5 coins!");
    Full method:
    Code:
            for (String p : losers) {
                Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Loser reward: 5 coins!");
                plugin.econ.depositPlayer(Bukkit.getPlayer(p), 5.0);
                if (Bukkit.getPlayer(p).hasPermission("dtp.warrior.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Warrior reward: 7 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 7.0);
                } else if (Bukkit.getPlayer(p).hasPermission("dtp.elite.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Elite reward: 9 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 9.0);
                } else if (Bukkit.getPlayer(p).hasPermission("dtp.legend.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Legend reward: 11 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 11.0);
                } else if (Bukkit.getPlayer(p).hasPermission("dtp.veteran.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Veteran reward: 13 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 13.0);
                }
            }
    The reason why it's null is because the loser list doesn't contain anything because the last player left the game which the methods above should cover that.

    I fixed this but only have one problem.

    Code:
    for (String p : losers) {
                Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Loser reward: 5 coins!");
                plugin.econ.depositPlayer(Bukkit.getPlayer(p), 5.0);
                if (Bukkit.getPlayer(p).hasPermission("dtp.warrior.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Warrior reward: 7 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 7.0);
                } else if (Bukkit.getPlayer(p).hasPermission("dtp.elite.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Elite reward: 9 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 9.0);
                } else if (Bukkit.getPlayer(p).hasPermission("dtp.legend.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Legend reward: 11 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 11.0);
                } else if (Bukkit.getPlayer(p).hasPermission("dtp.veteran.coins.loss")) {
                    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Veteran reward: 13 coins!");
                    plugin.econ.depositPlayer(Bukkit.getPlayer(p), 13.0);
                }
            }
    The issue is:
    Code:
    Bukkit.getPlayer(p).sendMessage(plugin.prefix + "Loser reward: 5 coins!");
    It's null because the player left. I've removed this code to test if the game ended if they left and it did. Is there a way I can make it so if they leave and there's one player on that team it just ignores this?

    Fixed that actually I just did try then catch.
    But it's not giving winner rewards now....
     
    Last edited: Jun 18, 2016
  4. Offline

    Lolmewn

    You don't remove a player name if it is the last one as far as I can see. Another way to tackle this problem is to not remove the players from the list when they leave, but instead, check if they are online when fetching a (Offline)Player object related to a player name (pst: UUIDs are better).
     
  5. Offline

    VinexAx789

    Fixed it on my own thanks for trying though.
     
Thread Status:
Not open for further replies.

Share This Page