NullPointerException

Discussion in 'Plugin Development' started by xxNightlordx, May 10, 2013.

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

    xxNightlordx

    I cant seem to figure out what I'm doing wrong in this chunk of code:

    Code:
        public void pay(){
           
            for(Player damager: list){
                econ.depositPlayer(damager.getName(), damage.get(damager) * 5);
               
                damager.sendMessage(ChatColor.DARK_AQUA + "You have recieved " + ChatColor.GOLD + "$" + damage.get(damager) * configMoney + ChatColor.DARK_AQUA + " for killing " + player);
               
            }
        }
    The error pointed me towards:
    Code:
    econ.depositPlayer(damager.getName(), damage.get(damager) * 5);
    I'm pretty sure I followed the vault tutorial correctly :(
     
  2. Offline

    r0306

  3. Offline

    gomeow

    Please post the full stack trace
     
  4. Offline

    xxNightlordx

    Main:
    Code:
    package me.Xeroun.Main;
     
    import java.util.HashMap;
    import java.util.List;
    import java.util.logging.Logger;
     
    import net.milkbowl.vault.economy.Economy;
     
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.PluginDescriptionFile;
    import org.bukkit.plugin.RegisteredServiceProvider;
    import org.bukkit.plugin.java.JavaPlugin;
     
    public class Main extends JavaPlugin{
       
        public Events e;
        public Economy econ = null;
        private static final Logger log = Logger.getLogger("Minecraft");
        public HashMap<Player, DamageInfo> PlayerInfo = new HashMap<Player, DamageInfo>();
       
        public void info(String info){
            PluginDescriptionFile pdfFile = this.getDescription();
            System.out.println(pdfFile.getName() + " " + "v" + pdfFile.getVersion() + " " + info);
        }
       
        public void onDisable(){
            info("Disabled!");
        }
       
       
        public void onEnable(){
            info("Enabled!");
            getConfig().options().copyDefaults(true);
            saveConfig();
            e = new Events(this);
            getServer().getPluginManager().registerEvents(e, this);
            DamageInfo.configTime = getConfig().getInt("Time");
            DamageInfo.configMoney = getConfig().getInt("Money per Damage");
            if (!setupEconomy() ) {
                log.severe(String.format("[%s] - Disabled due to no Vault dependency found!", getDescription().getName()));
                getServer().getPluginManager().disablePlugin(this);
                return;
            }
     
        }
       
        private boolean setupEconomy() {
            if (getServer().getPluginManager().getPlugin("Vault") == null) {
                return false;
            }
            RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
            if (rsp == null) {
                return false;
            }
            econ = rsp.getProvider();
            return econ != null;
        }
    }
    DamageInfo:
    Code:
    package me.Xeroun.Main;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
     
    import net.milkbowl.vault.economy.EconomyResponse;
     
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
     
     
    public class DamageInfo {
     
        public Main main;
        public DamageInfo(Main main){
            this.main = main;
        }
       
        public DamageInfo(Player player){
            this.player = player;
        }
       
       
        public HashMap<Player, Integer> damage = new HashMap<Player, Integer>();
        public HashMap<Player, Integer> time = new HashMap<Player, Integer>();
       
        String p;
        Player player;
        List<Player> list = new ArrayList<Player>();
        static int configTime;
        static int configMoney;
       
     
       
        public int getDamage(Player p){
            int damage = 0;
           
            if(this.damage.containsKey(p)){
                damage = this.damage.get(p);
            }else{
                damage = 0;
            }
           
            return damage;
        }
       
        public int getTime(Player p){
            int t = 0;
           
            if(this.time.containsKey(p)){
                t = this.time.get(p);
            }else{
                t = 0;
            }
           
            return t;
        }
       
        public void add(Player damager, int damage){
           
            time.put(damager, configTime);
           
            if(!list.contains(damager)){
                list.add(damager);
            }
           
            if(!this.damage.containsKey(damager)){
                this.damage.put(damager, damage);
            }else if(this.damage.containsKey(damager)){
                this.damage.put(damager, getDamage(damager) + damage);
            }
           
        }
       
        public void tick(Player player){
            time.put(player, time.get(player) - 1);
        }
       
        public void pay(){
           
            for(Player damager: list){
                main.econ.depositPlayer(damager.getName(), damage.get(damager) * configMoney);
               
                damager.sendMessage(ChatColor.DARK_AQUA + "You have recieved " + ChatColor.GOLD + "$" + damage.get(damager) * configMoney + ChatColor.DARK_AQUA + " for killing " + player);
               
            }
        }
       
        public void reset(){
            damage.clear();
            time.clear();
            list.clear();
        }
       
    }
    Events:
    Code:
    package me.Xeroun.Main;
     
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.PlayerDeathEvent;
     
    public class Events implements Listener{
        public Main main;
        public Events(Main main) {
            this.main = main;
        }
       
        @EventHandler
        public void onPlayerDamage(EntityDamageByEntityEvent e){
     
            if ((e.getEntity() instanceof Player) && (e.getDamager() instanceof Player)){
                Player damaged = (Player) e.getEntity();
                Player damager = (Player) e.getDamager();
                int damage = e.getDamage();
               
                if(!main.PlayerInfo.containsKey(damaged)){
                   
                    DamageInfo di = new DamageInfo(damaged);
                    di.add(damager, damage);
                    main.PlayerInfo.put(damaged, di);
                }else if(main.PlayerInfo.containsKey(damaged)){
                   
                    DamageInfo di = main.PlayerInfo.get(damaged);
                    di.add(damager, damage);
                   
                    main.PlayerInfo.put(damaged, di);
                }
         
            }
        }
       
        @EventHandler
        public void ondeath (PlayerDeathEvent event){
            Player player = (Player) event.getEntity();
            main.PlayerInfo.get(player).pay();
            main.PlayerInfo.get(player).reset();
        }
    }
     
  5. Offline

    gomeow

    erm..
     
  6. Offline

    xxNightlordx

    I'm not sure what you mean by full stack trace XD
     
  7. Offline

    gomeow

    The error log
     
  8. Offline

    Compressions

    xxNightlordx Post the entire error from the server console.
     
  9. Offline

    microgeek

  10. Offline

    xxNightlordx

    Ah ok I see:
    Code:
    2013-05-10 21:13:43 [SEVERE] Could not pass event PlayerDeathEvent to PayPerKill v1
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
        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.v1_5_R3.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:340)
        at net.minecraft.server.v1_5_R3.EntityPlayer.die(EntityPlayer.java:293)
        at net.minecraft.server.v1_5_R3.EntityLiving.damageEntity(EntityLiving.java:750)
        at net.minecraft.server.v1_5_R3.EntityHuman.damageEntity(EntityHuman.java:684)
        at net.minecraft.server.v1_5_R3.EntityPlayer.damageEntity(EntityPlayer.java:358)
        at net.minecraft.server.v1_5_R3.EntityHuman.attack(EntityHuman.java:874)
        at net.minecraft.server.v1_5_R3.PlayerConnection.a(PlayerConnection.java:1101)
        at net.minecraft.server.v1_5_R3.Packet7UseEntity.handle(SourceFile:36)
        at net.minecraft.server.v1_5_R3.NetworkManager.b(NetworkManager.java:292)
        at net.minecraft.server.v1_5_R3.PlayerConnection.d(PlayerConnection.java:109)
        at net.minecraft.server.v1_5_R3.ServerConnection.b(SourceFile:35)
        at net.minecraft.server.v1_5_R3.DedicatedServerConnection.b(SourceFile:30)
        at net.minecraft.server.v1_5_R3.MinecraftServer.r(MinecraftServer.java:581)
        at net.minecraft.server.v1_5_R3.DedicatedServer.r(DedicatedServer.java:226)
        at net.minecraft.server.v1_5_R3.MinecraftServer.q(MinecraftServer.java:477)
        at net.minecraft.server.v1_5_R3.MinecraftServer.run(MinecraftServer.java:410)
        at net.minecraft.server.v1_5_R3.ThreadServerApplication.run(SourceFile:573)
    Caused by: java.lang.NullPointerException
        at me.Xeroun.Main.DamageInfo.pay(DamageInfo.java:84)
        at me.Xeroun.Main.Events.ondeath(Events.java:42)
        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:425)
        ... 20 more
     
  11. Offline

    Compressions

    xxNightlordx I'm confused. How are you making custom events and using HashMaps when you don't know what a stack trace is?
     
  12. Offline

    xxNightlordx

    I' m not making custom events
     
  13. Offline

    gomeow

  14. Offline

    Compressions

    I don't even know. It's 1 o'clock and I ought to get to bed as my brain is dysfunctional at the moment.
     
  15. Offline

    xxNightlordx

    So do you think you guys can find the problem in my code?
     
  16. Offline

    Compressions

    xxNightlordx Check line 84 of DamageInfo and line 42 of Events. Those are where your NPE's are occurring.
     
  17. Offline

    xxNightlordx

    I already know where the error is:
    Code:
    main.econ.depositPlayer(damager.getName(), damage.get(damager) * configMoney);
    But I can't seem to figure out what the problem is
     
  18. Offline

    gomeow

    Obviously one of those variables is null
     
  19. Offline

    xxNightlordx

    I tried replacing all of the variables:
    Code:
    main.econ.depositPlayer("Xeroun", 3* 2);
    But it still turns out null. I think it might have to do something with the econ.depositPlayer
     
  20. Offline

    gomeow

    more likely main
     
  21. Offline

    chasechocolate

    xxNightlordx do a check to see if those variables are null before calling the method.
     
  22. Offline

    xxNightlordx

    I changed it to this:
    Code:
                if(damager.getName() != null && damage.get(damager) != null && configMoney != 0 ){
                    main.econ.depositPlayer(damager.getName(), damage.get(damager) * configMoney);
                    damager.sendMessage(ChatColor.DARK_AQUA + "You have recieved " + ChatColor.GOLD + "$" + damage.get(damager) * configMoney + ChatColor.DARK_AQUA + " for killing " + player.getName());
                }
    And it still gives me a NullPointerException :(
     
  23. Offline

    gomeow

    You never initialize DamageInfo or Events
     
Thread Status:
Not open for further replies.

Share This Page