[Solved]HashMap says its empty when called from one method, but not another

Discussion in 'Plugin Development' started by libraryaddict, Aug 24, 2012.

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

    libraryaddict

    Code:
    package me.libraryaddict.Archergames.Abilitys;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import me.libraryaddict.Archergames.Ability;
    import me.libraryaddict.Archergames.AbilityStartEvent;
    import me.libraryaddict.Archergames.PlayerKilledEvent;
    import me.libraryaddict.Archergames.TimeSecondEvent;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.GameMode;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.potion.PotionEffect;
    import org.bukkit.potion.PotionEffectType;
    
    public class Teamer implements Listener {
      // Teamer get buffs for every so and so players in team
      // 3 - speed, 5 - strength 7 - regen 10-jump
      // Teamers can't hurt each other
      public Map<String, List<String>> teams = new HashMap<String, List<String>>();
      Map<String, String> invitations = new HashMap<String, String>();
      private final Ability plugin = new Ability();
    
      @EventHandler
      public void onAbilityEnable(AbilityStartEvent event) {
        Player[] list = Bukkit.getOnlinePlayers();
        for (Player p : list) {
          if (this.plugin.getAbility(p.getName(), "Teamer")) {
            List<String> team = new ArrayList<String>();
            team.add(p.getName());
            teams.put(p.getName(), team);
            team = teams.get(p.getName());
            for (String b : team)
              log(b + " is in team " + p.getName());
          }
        }
        log("Size is " + teams.size());
      }
    
      @EventHandler
      public void onSecond(TimeSecondEvent event) {
        for (String player : teams.keySet()) {
          List<String> team = teams.get(player);
          List<PotionEffectType> effects = new ArrayList<PotionEffectType>();
          int size = team.size();
          if (size >= 4) {
            effects.add(PotionEffectType.SPEED);
          }
          if (size >= 6) {
            effects.add(PotionEffectType.INCREASE_DAMAGE);
          }
          if (size >= 8) {
            effects.add(PotionEffectType.REGENERATION);
          }
          if (size >= 10) {
            effects.add(PotionEffectType.JUMP);
          }
          for (PotionEffectType pot : effects) {
            for (String p : team)
              Bukkit.getPlayerExact(p).addPotionEffect(
                  new PotionEffect(pot, 200, 0));
          }
        }
      }
    
      @EventHandler
      public void playAttack(EntityDamageByEntityEvent event) {
        if (event.getEntity() instanceof Player
            && event.getDamager() instanceof Player) {
          Player hurt = (Player) event.getEntity();
          Player hurter = (Player) event.getDamager();
          log("Checking first");
          if (!getTeam(hurt).equals("") && !getTeam(hurter).equals("")) {
            log("Check successful");
            String team1 = getTeam(hurt);
            String team2 = getTeam(hurter);
            if (team1.equals(team2)) {
              log("third wins as well");
              event.setCancelled(true);
            }
          }
        }
      }
    
      public void log(String str) {
        if (Bukkit.getPlayerExact("libraryaddict") != null) {
          Bukkit.getPlayerExact("libraryaddict").sendMessage(str);
        }
      }
    
      public String getTeam(Player player1) {
        log("ok the size is " + teams.size());
        log("Checking if " + player1.getName() + " is in a team");
        for (String player : teams.keySet()) {
          log("Going to check if " + player1.getName() + " is in team " + player);
          List<String> play = teams.get(player);
          if (play.contains(player1.getName())) {
            log(player1.getName() + " is in team " + player);
            return player;
          }
        }
        log(player1 + " is not in a team");
        return "";
      }
    
      public void invitePlayer(Player inviter, String[] args) {
        if (!getTeam(inviter).equals("")) {
          log("He is in team");
          if (getTeam(inviter).equals(inviter.getName())) {
            if (args.length > 1) {
              if (Bukkit.getPlayer(args[1]) != null) {
                Player player = Bukkit.getPlayer(args[1]);
                if (getTeam(player).equals("")) {
                  if (!invitations.containsKey(player)) {
                    if (player.getGameMode() == GameMode.SURVIVAL) {
                      invitations.put(player.getName(), inviter.getName());
                      player.sendMessage(ChatColor.BLUE
                          + "You have been invited to " + inviter.getName()
                          + "'s team!");
                      teamMessage(inviter, ChatColor.BLUE + inviter.getName()
                          + " is inviting " + player.getName() + " into the team!");
                    } else {
                      inviter.sendMessage(ChatColor.RED
                          + "Unable to invite spectator");
                    }
                  } else {
                    inviter.sendMessage(ChatColor.RED
                        + "That player is already being invited to a team by "
                        + invitations.get(player) + "!");
                  }
                } else {
                  inviter.sendMessage(ChatColor.RED
                      + "That player is already in a team!");
                }
              } else {
                inviter.sendMessage(ChatColor.RED
                    + "Can't find player. Use /team invite <Player>");
              }
            } else {
              inviter.sendMessage(ChatColor.RED
                  + "You must define a player name. /team invite <Player>");
            }
          } else {
            inviter.sendMessage(ChatColor.RED
                + "You are not the leader of your team!");
          }
        } else {
          inviter.sendMessage(ChatColor.RED + "You are not in a team!");
        }
      }
    
      public void kickPlayer(Player kicker, String[] args) {
        if (!getTeam(kicker).equals("")) {
          if (!getTeam(kicker).equals(kicker.getName())) {
            if (args.length > 1) {
              if (Bukkit.getPlayer(args[1]) != null) {
                Player player = Bukkit.getPlayer(args[1]);
                if (!getTeam(player).equals("")
                    && getTeam(player).equals(kicker.getName())) {
                  teamMessage(kicker, ChatColor.RED + kicker.getName()
                      + " has kicked " + player.getName() + " out the team!");
                  List<String> team = teams.get(kicker.getName());
                  team.remove(player);
                  teams.put(kicker.getName(), team);
                } else {
                  kicker.sendMessage(ChatColor.RED
                      + "That player is not in your team!");
                }
              } else {
                kicker.sendMessage(ChatColor.RED
                    + "Can't find player. Use /team kick <Player>");
              }
            } else {
              kicker.sendMessage(ChatColor.RED
                  + "You must define a player name. /team kick <Player>");
            }
          } else {
            kicker.sendMessage(ChatColor.RED
                + "You are not the leader of your team!");
          }
        } else {
          kicker.sendMessage(ChatColor.RED + "You are not in a team!");
        }
      }
    
      public void teamMessage(Player player, String message) {
        List<String> team = teams.get(player);
        for (String p : team) {
          if (Bukkit.getPlayerExact(p) != null)
            Bukkit.getPlayerExact(p).sendMessage(message);
        }
      }
    
      @EventHandler
      public String getMembers(Player playername) {
        String list = "";
        List<String> members = teams.get(getTeam(playername));
        for (String B : members)
          list = list + B + ", ";
        if (list.length() > 2) {
          list = list.substring(0, list.length() - 2);
        }
        return list;
      }
    
      public void sendMembers(Player player) {
        if (!getTeam(player).equals("")) {
          String msg = ChatColor.BLUE + "Members: " + getMembers(player) + ".";
          player.sendMessage(msg);
        } else {
          player.sendMessage(ChatColor.RED + "You are not in a team!");
        }
      }
    
      public void leaveTeam(Player player) {
        if (!getTeam(player).equals("")) {
          if (getTeam(player).equals(player.getName())) {
            String p = getTeam(player);
            List<String> team = teams.get(p);
            teamMessage(Bukkit.getPlayerExact(p), ChatColor.RED + player.getName()
                + " has left the team!");
            team.remove(player.getName());
            teams.put(p, team);
          } else {
            player.sendMessage(ChatColor.RED + "You can't leave your own team!");
          }
        } else {
          player.sendMessage(ChatColor.RED + "You are not in a team!");
        }
      }
    
      public void acceptInvitation(Player player) {
        if (invitations.containsKey(player.getName())) {
          String p = invitations.get(player.getName());
          invitations.remove(player.getName());
          List<String> team = teams.get(p);
          team.add(player.getName());
          teams.put(p, team);
          teamMessage(Bukkit.getPlayerExact(p), ChatColor.RED + player.getName()
              + " has joined the team!");
        } else {
          player.sendMessage(ChatColor.RED
              + "You were not invited to any teams! Forever alone..");
        }
      }
    
      public void onDeath(PlayerKilledEvent event) {
        if (!getTeam(event.getKilled()).equals("")) {
          String Team = getTeam(event.getKilled());
          Player team = Bukkit.getPlayerExact(Team);
          if (team == event.getKilled()) {
            teamMessage(team, ChatColor.RED
                + "The team has been disbanded as the team leader has died");
            teams.remove(Team);
          } else {
            teamMessage(team, ChatColor.RED + "The team member "
                + event.getKilled().getName() + " has died");
            List<String> teem = teams.get(Team);
            teem.remove(event.getKilled().getName());
            teams.put(Team, teem);
          }
        }
      }
    }
    
    When I call the method getTeam() from invitePlayer, At the very first check it fails.
    Inside the method getTeam it tells me that "teams" is 0 big.

    But when I call it from entitydamagebyentityevent.
    It tells me that "teams" is as big as it should have been.

    And it all acts accordingly.

    The method invitePlayer() is called from another class however.

    So basically.
    Why is it telling invitePlayer() when it calls getTeam() that teams is empty?

    Fixed.

    No idea why but making teams static fixed my issue

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 28, 2016
Thread Status:
Not open for further replies.

Share This Page