Event Bugged. Weird error.

Discussion in 'Plugin Development' started by MrDplugins, Sep 10, 2015.

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

    MrDplugins

    Hi so I'm currently making my own Free-for-all gamemode and I'm adding 5 lives per player but when the arena starts it says the player has only one life.

    My Classes:

    Arena
    Code:
    public class Arena {
    
        public enum ArenaState {
            WAITING, COUNTDOWN, STARTED
        }
    
        private String id;
        private CuboidSelection bounds;
        private ArenaState state;
    
        public ArrayList<Spawn> spawns;
    
    
        private ArrayList<Player> players;
        private ArrayList<BlockState> changedBlocks;
    
        private ItemStack kitSelector;
    
        public Map<String, Integer> lives = new HashMap<String, Integer>();
    
        protected Arena(String id) {
            this.id = id;
        
            this.bounds = new CuboidSelection(
                    Bukkit.getServer().getWorld(SettingsManager.getArenas().<String>get(id + ".world")),
                    Main.loadLocation(SettingsManager.getArenas().<ConfigurationSection>get(id + ".cornerA")),
                    Main.loadLocation(SettingsManager.getArenas().<ConfigurationSection>get(id + ".cornerB"))
            );
        
            this.state = ArenaState.WAITING;
        
            this.spawns = new ArrayList<Spawn>();
            if (SettingsManager.getArenas().contains(id + ".spawns")) {
                for (String spawnID : SettingsManager.getArenas().<ConfigurationSection>get(id + ".spawns").getKeys(false)) {
                    spawns.add(new Spawn(Main.loadLocation(SettingsManager.getArenas().<ConfigurationSection>get(id + ".spawns." + spawnID))));
                }        
            }
        
            this.players = new ArrayList<Player>();
            this.changedBlocks = new ArrayList<BlockState>();
        
        }
    
        public String getID() {
            return id;
        }
    
        public CuboidSelection getBounds() {
            return bounds;
        }
    
        public int getMaxPlayers() {
            return spawns.size();
        }
    
        public ArenaState getState() {
            return state;
        }
    
        public Player[] getPlayers() {
            return players.toArray(new Player[players.size()]);
        }
    
        public boolean hasPlayer(Player p) {
            return players.contains(p);
        }
    
        public void addPlayer(Player p) {
            if (state.equals( ArenaState.STARTED)) {
                p.sendMessage(ChatColor.RED + "This arena has already started.");
                return;
            }
        
            if (players.size() + 1 > spawns.size()) {
                p.sendMessage(ChatColor.RED + "This arena is full.");
                return;
            }
        
            boolean success = false;
        
            for (Spawn spawn : spawns) {
                if (!spawn.hasPlayer()) {
                    spawn.setPlayer(p);
                    p.teleport(spawn.getLocation());
                    success = true;
                    break;
                }
            }
        
            if (!success) {
                p.sendMessage(ChatColor.RED + "Could not find spawn.");
                return;
            }
        
            players.add(p);
        
        
            // ADD 5 LIVES
        
            if(!lives.containsKey(p.getName())) {
                lives.put(p.getName(), 5);
                p.sendMessage(ChatColor.GREEN + "You have " + ChatColor.GREEN +  "5 LIVES");
            }
        
        
    
        
            p.getInventory().clear();
        
            kitSelector = new ItemStack(Material.NETHER_STAR, 1);
            ItemMeta meta = kitSelector.getItemMeta();
            meta.setDisplayName(ChatColor.GOLD + "Kit Selector");
            meta.setLore(Arrays.asList("Right click this", "to choose", "your kit."));
            kitSelector.setItemMeta(meta);
            p.getInventory().addItem(kitSelector);
            p.updateInventory();
    
            p.sendMessage(ChatColor.GREEN + "You have joined arena " + id + ".");
        
            if (players.size() >= spawns.size() && state.equals(ArenaState.WAITING)) {
                this.state = ArenaState.COUNTDOWN;
                new Countdown(this, 30, 25, 20, 10, 5, 4, 3, 2, 1).runTaskTimerAsynchronously(Main.getPlugin(), 0, 20);
            }
        }
    
        public void removePlayer(Player p) {
            players.remove(p);
        
            for (Spawn spawn : spawns) {
                if (spawn.hasPlayer() && spawn.getPlayer().equals(p)) {
                    spawn.setPlayer(null);
                }
            }
        
            p.teleport(Bukkit.getServer().getWorlds().get(0).getSpawnLocation()); // TODO: Temporary.
        
            if (players.size() <= 1) {
                if (players.size() == 1) {
                    Bukkit.getServer().broadcastMessage(players.get(0).getName() + " has won arena " + id + "!");
                    players.remove(0);
                    players.get(0).teleport(Bukkit.getServer().getWorlds().get(0).getSpawnLocation()); // TODO: Temporary.
                }
            
                else {
                    Bukkit.getServer().broadcastMessage("Arena " + id + " has ended.");
                }
    
                for(Entity e : Bukkit.getWorld(this.getBounds().getWorld().getName()).getEntities()){
                    if(this.getBounds().contains(e.getLocation()) && e.getType() == EntityType.DROPPED_ITEM){
                        e.remove();
                    }
                }
    
                players.clear();
                rollback();
                state = ArenaState.WAITING;
            }
        }
    
        public void addSpawn(Location loc) {
            spawns.add(new Spawn(loc));
        }
    
    
        public void addBlockState(BlockState state) {
    
                        if (!changedBlocks.contains(state)) {
                            changedBlocks.add(state);
    
                        }
    
        }
    
        public void regen(final List<BlockState> blocks, final boolean effect, final long speed) {
    
            new BukkitRunnable() {
                int i = -1;
                @SuppressWarnings("deprecation")
                public void run() {
                    if (i != blocks.size() - 1) {
                        i++;
                        BlockState bs = changedBlocks.get(i);
                        bs.update(true, false);
                        if (effect)
                            bs.getBlock().getWorld().playEffect(bs.getLocation(), Effect.STEP_SOUND, bs.getBlock().getType());
                    }else {
    
                        blocks.clear();
                        this.cancel();
                    }
                }
            }.runTaskTimer(Main.getPlugin(), speed, speed);
        }
    
        public void rollback() {
    
            regen(changedBlocks, true, (long) 1);
    
    //        try {
    //            LocalWorld world = BukkitUtil.getLocalWorld(getBounds().getWorld());
    //            world.regenerate(getBounds().getRegionSelector().getRegion(), new EditSession(world, -1));
    //        }catch (Exception e){
    //            Bukkit.getServer().broadcastMessage(e.getLocalizedMessage());
    //        }
         }
    
        public void start() {
            this.state = ArenaState.STARTED;
        
            for (Player p : players) {
                if (p.getInventory().contains(kitSelector)){
                    // If player didn't select a kit, give the player the default "Archer" kit
                    Kit kit = KitManager.getInstance().getKit("Archer");
    
                    p.getInventory().clear();
    
                    for (ItemStack item : kit.getItems()) {
                        p.getInventory().addItem(item);
                    }
                }
                p.setHealth(20.0D);
                p.setGameMode(GameMode.SURVIVAL);
            }
        
            for (Spawn spawn : spawns) {
                spawn.setPlayer(null);
            }
        
    
        }
    
        public Location getSpawn(Player p){
            for (Spawn s : spawns){
                if (s.getPlayer() == p){
                    return s.getLocation();
                }
            }
            return null;
        }
    
    
    
    }
    My Death Event Class

    Code:
    public class PlayerDeath implements Listener{
    
        public Map<String, Integer> lives = new HashMap<String, Integer>();
        public  ArrayList<Spawn> spawns;
    
    
        @EventHandler
      
        public void onDeath(EntityDeathEvent event) {
            if(event.getEntity() instanceof Player){
               Player player = (Player) event.getEntity();
                Arena a = ArenaManager.getInstance().getArena(player);
            
            if (a.hasPlayer(player)) {
        
                if(lives.containsKey(player.getName())) {
                    lives.remove(player.getName(), 1);
                    player.sendMessage(ChatColor.DARK_RED + "You now have " + lives.get(player.getName()) + " lives");
            
            
                if(lives.get(player.getName()) == 4) {
                    for (Spawn spawn : spawns) {
                        if (!spawn.hasPlayer()) {
                            spawn.setPlayer(player);
                    player.teleport(spawn.getLocation());
                        }}}
            
                if(lives.get(player.getName()) == 3) {
                    for (Spawn spawn : spawns) {
                        if (!spawn.hasPlayer()) {
                            spawn.setPlayer(player);
                    player.teleport(spawn.getLocation());
                        }}}
            
                if(lives.get(player.getName()) == 2) {
                    for (Spawn spawn : spawns) {
                        if (!spawn.hasPlayer()) {
                            spawn.setPlayer(player);
                    player.teleport(spawn.getLocation());
                        }}}
            
                if(lives.get(player.getName()) == 1) {
                    for (Spawn spawn : spawns) {
                        if (!spawn.hasPlayer()) {
                            spawn.setPlayer(player);
                    player.teleport(spawn.getLocation());
                        }}}
            
                if(lives.get(player.getName()) == 0) {
                    a.removePlayer(player);
                    player.getInventory().clear();
                    for (Player p : a.getPlayers()) {
                        p.sendMessage(player.getName() + ChatColor.RED + " has been eliminated!");
                    }
    
                }
        }
             }
                }
        
        
            }
            }
    
     
    Last edited: Sep 14, 2015
  2. Offline

    RoboticPlayer

    A) Do you get any stack traces in the console?
    B) Are you registering the events?
     
  3. Offline

    Gamesareme

    @MrDplugins try and do.
    Code:
    lives.set(player.getName(), lives.get(player.getName() - 1);
    I think your problem is here.
     
  4. Offline

    MrDplugins

  5. Offline

    RoboticPlayer

    @MrDplugins
    A) Once again, are you registering your events?
    B) Why are you casting e.getPlayer() to player? e.getPlayer() returns a player, so that is a useless cast. Change:
    Code:
    Player player = (Player) e.getPlayer();
    to
    Code:
    Player player = e.getPlayer();
    C) It would actually be somewhat helpful for you to put your code in Java syntax. Can you do that? Just edit your original post, and instead of [ code ] (all of your code) [ /code ] do [ code=java ] (your code) [ /code ], just remove the spaces.
     
  6. Offline

    MrDplugins

    @henderry2019 I am registering my events, and the method getPlayer() is undefined.
     
  7. Offline

    Zombie_Striker

    @MrDplugins @henderry2019
    What you posted is wrong. You should use PlayerDeathEvent if you want to get the PLAYER'S death event. EntitiyDeathEvent is for ALL entities, but you only want the PLAYER'S.
     
  8. Offline

    RoboticPlayer

    @Zombie_Striker when I posted that, I though I was responding to a thread which has a player casting to player. It was with a PkayerRespawnEvent.
     
Thread Status:
Not open for further replies.

Share This Page