Solved My events are not passing! Please help.

Discussion in 'Plugin Development' started by valdev, Oct 29, 2012.

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

    valdev

    Hey guys!

    New to Bukkit's community so please mind my formatting if it is messed up. I'm getting a lot of issues passing the even to the listener.

    arena.java (main)
    Code:
    package com.blockpunchers.arena;
     
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
     
     
     
     
    public class Arena extends JavaPlugin {
        public static String player1 = "";
        public static String player2 = "";
        public static boolean inUse = false;
        public static boolean accepted = false;
       
        @Override
        public void onEnable(){
            PluginManager manager = this.getServer().getPluginManager();
            manager.registerEvents(new ArenaPluginListener(), this);
           
            getLogger().info("BlockPunchers Arena Now Live");
            player1 = "";
            player2 = "";
            inUse = false;
            accepted = false;
        }
     
        @Override
        public void onDisable() {
            getLogger().info("BlockPunchers Arena is now offline");
            player1 = "";
            player2 = "";
            inUse = false;
            accepted = false;
        }
       
        // Commands
        public boolean onCommand(CommandSender player, Command cmd, String label, String[] args){
            // If someone types the arena
            if(cmd.getName().equalsIgnoreCase("arena")){
                // if it actually contains something
                if(args.length == 0){
                    player.sendMessage("Arena request failed, please enter a username /arena username."); 
                    // and it isn't a bad name
                } else if (args[0].length() >= 3) {
                    // also if the player is online
                    if(getServer().getPlayer(args[0]) != null && inUse == false){
                        player.sendMessage("You have sent an arena challenge to " + args[0]);
                        getServer().getPlayer(args[0]).sendMessage("You have been sent a challenge to the arena! Type /arenaaccept or /arenadecline.");
                        inUse = true;
                        player1 = player.getName();
                        player2 = getServer().getPlayer(args[0]).getName();
                        // If the arena is currently in use
                        }else if(inUse == true){
                            player.sendMessage("The arena is currently being used, you can kill people later.");
                        // If the player is off line
                        } else {
                            player.sendMessage("Player is not online");
                        }
                }
                return true;
            }
            // If someone types the arena
            if(cmd.getName().equalsIgnoreCase("arenaaccept")){
                // send decline message and set used to false
                if(player.getName().equalsIgnoreCase(player2) && accepted != true){
                    player.sendMessage("You have accepted.");
                    accepted = true;
                    getServer().getPlayer(player1).sendMessage(player2 + " has accepted.");
                    getServer().getPlayer(player1).teleport(new Location(Bukkit.getWorld("world"),10,65,213));
                    getServer().getPlayer(player2).teleport(new Location(Bukkit.getWorld("world"),10,65,194));
                } else if(accepted=true) {
                    player.sendMessage("You've already accepted.");
                } else {
                    player.sendMessage("You don't have any arena challenges.");
                }
                return true;
            }
            if(cmd.getName().equalsIgnoreCase("arenadecline")){
                // send decline message and set used to false
                if(player.getName().equalsIgnoreCase(player2) && accepted != true){
                getServer().getPlayer(player1).sendMessage(player2 + " has declined.");
                player1 = "";
                player2 = "";
                inUse = false;
                accepted = false;
                } else if(accepted==true) {
                    player.sendMessage("You've already accepted.");
                } else {
                    player.sendMessage("You don't have any arena challenges.");   
                }
                return true;
            }
           
            if(cmd.getName().equalsIgnoreCase("arenainfo")){
                getServer().getPlayer(player1).sendMessage(player1 + player2 + inUse + accepted);
                getServer().getPlayer(player2).sendMessage(player1 + player2 + inUse + accepted);
            }
       
            player.sendMessage("Arena request failed, please enter a username /arena username.");
            return false;
        }
     
    }
    ArenaPluginListener.java (listener)
    Code:
    package com.blockpunchers.arena;
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
     
     
     
    public class ArenaPluginListener implements Listener{
     
       
        @EventHandler()
        public void onDeathEvent(PlayerDeathEvent event){
            String player1 = Arena.player1;
            String player2 = Arena.player2;
            String killer = event.getEntity().getKiller().getDisplayName();
            if(Arena.accepted = true){
            if(killer == player2){
                event.setDeathMessage(player2 + " has killed " + player1 + " in the arena.");
                Bukkit.getPlayer(player2).teleport(new Location(Bukkit.getWorld("world"),-59,64,189));
                Arena.inUse = false;
                Arena.accepted = false;
                Arena.player1 = "";
                Arena.player2 = "";
                return;
            }
            if(killer == player1){
                event.setDeathMessage(player1 + " has killed " + player2 + " in the arena.");
                Bukkit.getPlayer(player1).teleport(new Location(Bukkit.getWorld("world"),-59,64,189));
                Arena.inUse = false;
                Arena.accepted = false;
                Arena.player1 = "";
                Arena.player2 = "";
                return;
            }
            }
           
        }
        @EventHandler()
        public void onOfflineEvent(PlayerQuitEvent event){
            String player1 = Arena.player1;
            String player2 = Arena.player2;
            if(Arena.accepted = true){
            if(event.getPlayer().getKiller().getDisplayName() == player2){
                event.setQuitMessage(player2 + " has killed " + player1 + " in the arena.");
                Bukkit.getPlayer(player1).teleport(new Location(Bukkit.getWorld("world"),-59,64,189));
                Bukkit.getPlayer(player2).teleport(new Location(Bukkit.getWorld("world"),-59,64,189));
                Arena.inUse = false;
                Arena.accepted = false;
                Arena.player1 = "";
                Arena.player2 = "";
                return;
            }
            if(event.getPlayer().getKiller().getDisplayName() == player1){
                event.setQuitMessage(player1 + " has killed " + player2 + " in the arena.");
                Bukkit.getPlayer(player1).teleport(new Location(Bukkit.getWorld("world"),-59,64,189));
                Bukkit.getPlayer(player2).teleport(new Location(Bukkit.getWorld("world"),-59,64,189));
                Arena.inUse = false;
                Arena.accepted = false;
                Arena.player1 = "";
                Arena.player2 = "";
                return;
            }
            }
        }
    }
    Any ideas geniuses of Bukkit?

    Also here is the plugin.yml
    Code:
    name: Arena
    main: com.blockpunchers.arena.Arena
    version: 0.1
    commands:
      arena:
        description: Base command for the BlockPunchers Arena
        usage: /<command> name amount
      arenaaccept:
        description: To accept arena invites
        usage: /<command>
      arenadecline:
        description: To decline arena invites
        usage: /<command>
      arenainfo:
        description: To get info arena
        usage: /<command>
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 29, 2016
  2. Offline

    Deleted user

    Everything seems to be correct, the event's are registered in the main class, your event listener class implements listener, you're using @EventHandler.. this is strange. Any errors? How do you know the events are register does just nothing happen when it should?
     
  3. Offline

    valdev

    I get this error whenever someone dies, plus a NullPointerExcption.

    Code:
    2012-10-29 22:25:03 [SEVERE] Could not pass event PlayerDeathEvent to Arena v0.1
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:341)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:322)
        at net.minecraft.server.EntityPlayer.die(EntityPlayer.java:246)
        at net.minecraft.server.EntityLiving.damageEntity(EntityLiving.java:717)
        at net.minecraft.server.EntityHuman.damageEntity(EntityHuman.java:585)
        at net.minecraft.server.EntityPlayer.damageEntity(EntityPlayer.java:291)
        at org.bukkit.craftbukkit.entity.CraftLivingEntity.damage(CraftLivingEntity.java:167)
        at org.bukkit.craftbukkit.entity.CraftLivingEntity.damage(CraftLivingEntity.java:152)
        at org.bukkit.command.defaults.KillCommand.execute(KillCommand.java:33)
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:183)
        at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:502)
        at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:911)
        at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:824)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:806)
        at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:44)
        at net.minecraft.server.NetworkManager.b(NetworkManager.java:282)
        at net.minecraft.server.NetServerHandler.d(NetServerHandler.java:111)
        at net.minecraft.server.ServerConnection.b(SourceFile:35)
        at net.minecraft.server.DedicatedServerConnection.b(SourceFile:30)
        at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:569)
        at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:215)
        at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:486)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:419)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:818)
    Caused by: java.lang.NullPointerException
        at com.blockpunchers.arena.ArenaPluginListener.onDeathEvent(ArenaPluginListener.java:18)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:339)
        ... 26 more
    Is it possible my code has no access to my variables?
     
  4. Offline

    ThatBox

    valdev
    You should check if the player's killer is null like so:
    Code:java
    1. if(killer != null) {
    2. // Code here
    3. }

    PlayerDeathEvent is called when a player dies, not when they are killed because they can die. For example, falling to their death.
     
  5. Offline

    valdev

    This looks like it is working, well almost! It's not setting the variables at the end.

    QUick edit it looks like

    // If someone types the arena
    if(cmd.getName().equalsIgnoreCase("arenaaccept")){
    // send decline message and set used to false
    if(player.getName().equalsIgnoreCase(player2) && accepted != true){
    player.sendMessage("You have accepted.");
    accepted = true;
    getServer().getPlayer(player1).sendMessage(player2 + " has accepted.");
    getServer().getPlayer(player1).teleport(new Location(Bukkit.getWorld("world"),10,65,213));
    getServer().getPlayer(player2).teleport(new Location(Bukkit.getWorld("world"),10,65,194));
    } else if(accepted=true) {
    player.sendMessage("You've already accepted.");
    } else {
    player.sendMessage("You don't have any arena challenges.");
    }
    return true;
    }

    Is having issues, its skipping the check
     
  6. Offline

    ThatBox

    I don't know how that can't be working. :eek:
     
  7. Offline

    valdev

    Got it, turns out using == is for comparing and = is for setting lol. Thanks all!
     
Thread Status:
Not open for further replies.

Share This Page