Permissions Attachments problem.

Discussion in 'Plugin Development' started by CritWhale, Feb 20, 2013.

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

    CritWhale

    I'm a relatively new programmer and still don't completely know how to fix an NPE. I'm trying to build a plugin that gets permissions from a config key, Then assigns them to players who apply for the job. I'm using the hat command as a test for the permissions.
    Also If anyone can better inform me on how to use attachments it would be greatly appreciated.

    Main
    Code:
            @Override
            public void onEnable(){
                // TODO Insert logic to be performed when the plugin is enabled
                new BukkitListener(this);
                JobApi = new JobApi(this);
                JobApi.startup();
                JobApi.getJobKeys();
                JobApi.createJobs();
                Scheduler = new Scheduler(this);
                Scheduler.startScheduler();
                if (!setupEconomy() ) {
                    getServer().getPluginManager().disablePlugin(this);
                    return;
                }
                }
       
            @Override
            public void onDisable() {
                // TODO Insert logic to be performed when the plugin is disabled
            }
           
            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;
            }
           
            public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
                Player p = (Player) sender;
                if(label.equalsIgnoreCase("hat")){
                    if(p.hasPermission("permissions.here")){
                        System.out.print(p.hasPermission("permissions.here"));
                    if(args.length == 1) {
                    int a = Integer.parseInt(args[0]);
                    p.getInventory().setHelmet(new ItemStack(a));
                    }
                    }  else{
                        System.out.println("You don't Have permission to use that command!");
                    }
                }
                if(label.equalsIgnoreCase("Job")){
                    if(args.length == 1) {
                        String s = args[0];
                        System.out.println(s);
                        JobApi.joinJob(p,s);
                    }
                }
                    return false;        
            }
     
    }
    JobApi
    Code:
    package com.critwhale.DarkRp;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Set;
     
    import org.bukkit.configuration.ConfigurationSection;
    import org.bukkit.entity.Player;
     
    import com.critwhale.DarkRp.ConfigAccessor;
     
    public class JobApi {
        DarkRp plugin;
        static ConfigAccessor JobConfig;
        String[] jobs;
        int jobNumbers;
        String jobNames;
        List<Job> joblist = new ArrayList<Job>();
       
        public JobApi(DarkRp plugin) {
            this.plugin = plugin;   
        }
     
        public void startup () {
            JobConfig = new ConfigAccessor(plugin, "Jobs.yml");
            JobConfig.reloadConfig();
            JobConfig.saveDefaultConfig();
            JobConfig.reloadConfig();
        }
       
        public void getJobKeys(){
            ConfigurationSection testKey = JobConfig.getConfig().getConfigurationSection("Jobs");
            if(testKey == null){
                testKey = JobConfig.getConfig().createSection("jobs");
                }
            Set<String> jobKeys = testKey.getKeys(false);
            jobs = jobKeys.toArray(new String[10]);
            jobNumbers = jobKeys.size();
            System.out.println(jobNumbers + " Jobs Found, " + jobKeys.toString());
                }
       
        public void createJobs(){
            for(int i = 0; i < jobNumbers; i++){
                joblist.add(new Job(jobs[i]));
            }
        }
        public void joinJob(Player p,String jName){
            for(int i = 0; i < jobNumbers; i++)
                if(joblist.get(i).jobName.equalsIgnoreCase(jName)){
                    joblist.get(i).setPlayer(p);
                }
        }
    }
    Job
    Code:
    package com.critwhale.DarkRp;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
     
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.permissions.PermissionAttachment;
     
    public class Job {
        FileConfiguration JobLocation = JobApi.JobConfig.getConfig();
        HashMap<Player, PermissionAttachment> attachments = BukkitListener.attachments;
        String jobName;
        int slots;
        String Description;
        int Salary;
        boolean Vote;
        boolean hasLicense;
        ArrayList<String> players = new ArrayList<String>();
        List<String> permissions;
       
        public Job (String job){
            jobName = job;
            System.out.println(jobName);
            slots = JobLocation.getInt("Jobs." + jobName + ".Slots");
            System.out.println("Slots: " + slots);
            Salary = JobLocation.getInt("Jobs." + jobName + ".Salary");
            System.out.println("Salary: " + Salary);
            Vote = JobLocation.getBoolean("Jobs." + jobName + ".Vote");
            System.out.println("Vote: " + Vote);
            hasLicense = JobLocation.getBoolean("Jobs." + jobName + ".HasLicense");
            System.out.println("Has Arms License: " + hasLicense);
            permissions = JobLocation.getStringList("Jobs." + jobName + ".permissions");
            System.out.println("permissions 1" + permissions);
        }
        public void setPlayer(Player p){
            if(!players.contains(p.getName())) {
                players.add(p.getName());
                p.sendMessage("Your Hired!");
                int i2 = 0;
                for(int i = 0; i < permissions.size(); i++)
                attachments.get(p).setPermission(permissions.get(i2), true);
                i2++;
            }
            else if (players.contains(p.getName())) {
                p.sendMessage("Your already have this job.");
            }
        }
           
            public boolean checkPlayer(Player p, String name){
            if(players.contains(name)) {
                return true;
                }
            else {return false;
                }
        }
           
        public void removePlayer(Player p, String name) {
            if(players.contains(name)) {
                players.remove(name);
            }
        }
    }
    Code:
    package com.critwhale.DarkRp;
     
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Random;
     
    import net.milkbowl.vault.economy.EconomyResponse;
     
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.World;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockFace;
    import org.bukkit.block.Dispenser;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.Item;
    import org.bukkit.entity.LivingEntity;
    import org.bukkit.entity.Pig;
    import org.bukkit.entity.Player;
    import org.bukkit.entity.Projectile;
    import org.bukkit.entity.Snowball;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.block.BlockBreakEvent;
    import org.bukkit.event.block.BlockBurnEvent;
    import org.bukkit.event.block.SignChangeEvent;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
    import org.bukkit.event.entity.EntityDeathEvent;
    import org.bukkit.event.entity.EntityExplodeEvent;
    import org.bukkit.event.entity.ProjectileHitEvent;
    import org.bukkit.event.entity.ProjectileLaunchEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerPickupItemEvent;
    import org.bukkit.event.player.PlayerRespawnEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.material.Door;
    import org.bukkit.material.Sign;
    import org.bukkit.metadata.FixedMetadataValue;
    import org.bukkit.metadata.MetadataValue;
    import org.bukkit.permissions.PermissionAttachment;
    import org.bukkit.potion.PotionEffect;
    import org.bukkit.potion.PotionEffectType;
    import org.bukkit.scheduler.BukkitTask;
    import org.bukkit.util.Vector;
     
    public class BukkitListener implements Listener {
            public static DarkRp plugin;
            public static HashMap<Player,PermissionAttachment> attachments = new HashMap<Player,PermissionAttachment>();
     
            public BukkitListener(DarkRp instance) {
                plugin = instance;
                plugin.getServer().getPluginManager().registerEvents(this, plugin);
            }
        @EventHandler
        public void onPlayerJoin (PlayerJoinEvent event) {
            Player p = event.getPlayer();
            String ps = p.getName().toString();
            PermissionAttachment attachment = p.addAttachment(plugin);
            if (!attachments.containsKey(attachment)) {
                attachment = p.addAttachment(plugin);
                attachments.put(p, attachment);
                System.out.print(p + "added to attachments");
                System.out.print(attachments.keySet());
            }
        }
       
    }
    
    StackTrace
    Code:
    [INFO] TheParadoxataur issued server command: /job Mayor
    2013-02-20 21:13:19 [INFO] Mayor
    2013-02-20 21:13:19 [SEVERE] null
    org.bukkit.command.CommandException: Unhandled exception executing command 'job' in plugin Darkrp v1.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46)
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:186)
        at org.bukkit.craftbukkit.v1_4_6.CraftServer.dispatchCommand(CraftServer.java:514)
        at net.minecraft.server.v1_4_6.PlayerConnection.handleCommand(PlayerConnection.java:979)
        at net.minecraft.server.v1_4_6.PlayerConnection.chat(PlayerConnection.java:897)
        at net.minecraft.server.v1_4_6.PlayerConnection.a(PlayerConnection.java:852)
        at net.minecraft.server.v1_4_6.Packet3Chat.handle(Packet3Chat.java:44)
        at net.minecraft.server.v1_4_6.NetworkManager.b(NetworkManager.java:290)
        at net.minecraft.server.v1_4_6.PlayerConnection.d(PlayerConnection.java:112)
        at net.minecraft.server.v1_4_6.ServerConnection.b(SourceFile:39)
        at net.minecraft.server.v1_4_6.DedicatedServerConnection.b(SourceFile:30)
        at net.minecraft.server.v1_4_6.MinecraftServer.r(MinecraftServer.java:598)
        at net.minecraft.server.v1_4_6.DedicatedServer.r(DedicatedServer.java:224)
        at net.minecraft.server.v1_4_6.MinecraftServer.q(MinecraftServer.java:494)
        at net.minecraft.server.v1_4_6.MinecraftServer.run(MinecraftServer.java:427)
        at net.minecraft.server.v1_4_6.ThreadServerApplication.run(SourceFile:849)
    Caused by: java.lang.NullPointerException
        at com.critwhale.DarkRp.Job.setPlayer(Job.java:43)
        at com.critwhale.DarkRp.JobApi.joinJob(JobApi.java:51)
        at com.critwhale.DarkRp.DarkRp.onCommand(DarkRp.java:67)
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    No takers?

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 31, 2016
  2. Offline

    iWareWolf

    at com.critwhale.DarkRp.Job.setPlayer(Job.java:43)
    at com.critwhale.DarkRp.JobApi.joinJob(JobApi.java:51)
    at com.critwhale.DarkRp.DarkRp.onCommand(DarkRp.java:67)
     
  3. Offline

    CritWhale

    Yah, I can read the Stacktrace, but that doesn't mean I know whats wrong or how to fix it. If someone could explain what a NullPointerException is, and how to fix it/prevent it, I would greatly appreciate it.
     
  4. Offline

    iWareWolf

    CritWhale
    Its when something is null and you need to put up null checks like != null
     
  5. Offline

    Technius

    It means that you are trying to invoke a method on a null object

    For example:
    Code:
    Object o = null;
    o.someMethod(); //NPE because o is null
     
    Object o2 = new Object();
    o2.someMethod(); //No NPE because o2 is not null
    
     
  6. Offline

    CritWhale

    Thank you both very much!
     
Thread Status:
Not open for further replies.

Share This Page