Solved Confusing Error when getting Player.getName() through custom wrapper

Discussion in 'Plugin Development' started by arvenyon, Feb 19, 2020.

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

    arvenyon

    Hey Bukkit Folks,

    I am fairly new to bukkit plugin development, so go easy on me :D

    I made a custom wrapper, in order to get additional properties to my players.

    Here's my class for that:
    Code:
    public class CustomPlayer {
        public Player Player = myPlayer();
        public String Name = myName();
        public String CurrentJob = myCurrentJob();
        public UUID UniqueID = myUUID();
        public int JobExperience(String Job) { return myJobExperience(Job); }
        public int JobLevel(String Job) { return myJobLevel(Job); }
        public int WeaponExperience(String Weapon) { return myWeaponExperience(Weapon); }
        public int WeaponLevel(String Weapon) { return myWeaponLevel(Weapon); }
       
        private Player oPlayer;
      
        public CustomPlayer(Player P) {
            this.oPlayer = P;
        }
       
        public Player myPlayer() {
            return oPlayer;
        }
       
        private String myName() {
            return oPlayer.getName();
        }
       
        private UUID myUUID() {
            return oPlayer.getUniqueId();
        }
       
        private int myJobExperience(String Job) {
            return me.geekbuild.arvenyonRPG.Utils.Player.PlayerUtils.getPlayerJobExperience(oPlayer, Job);
        }
       
        private int myJobLevel(String Job) {
            return me.geekbuild.arvenyonRPG.Utils.Player.PlayerUtils.getPlayerJobLevel(oPlayer, Job);
        }
       
        private int myWeaponExperience(String Weapon) {
            return me.geekbuild.arvenyonRPG.Utils.Player.PlayerUtils.getPlayerWeaponExperience(oPlayer, Weapon);
        }
       
        private int myWeaponLevel(String Weapon) {
            return me.geekbuild.arvenyonRPG.Utils.Player.PlayerUtils.getPlayerWeaponLevel(oPlayer, Weapon);
        }
       
        private String myCurrentJob() {
            return me.geekbuild.arvenyonRPG.Utils.Player.PlayerUtils.getPlayerJobName(oPlayer);
        }
    }
    As you can see, in my constructor, I pass the player to my private variable in order to use it afterwards for different methods.
    Somehow, I get an error when reaching for the custom playerstats through my wrapper:
    Code:
            if (sender instanceof Player) {
                Player oP = (Player)sender;
                CustomPlayer P = new CustomPlayer(oP);
    ... (some code)
            for (String line : playerJobStats(P, "Lumberjack")) {
                 P.Player.sendMessage(line);
            }
    Method playerJobStats:
    Code:
    public ArrayList<String> playerJobStats(CustomPlayer P, String askedJob) {
            ChatColor gray = ChatColor.GRAY;
            ChatColor dgray = ChatColor.DARK_GRAY;
            ChatColor dgreen = ChatColor.DARK_GREEN;
            ChatColor green = ChatColor.GREEN;
            ChatColor gold = ChatColor.GOLD;
            ChatColor red = ChatColor.RED;
          
            String PlayerCurrentJob = P.CurrentJob;
            int PlayerJobLevel = P.JobLevel(askedJob);
            int PlayerJobExperience = P.JobExperience(askedJob);
          
            ArrayList<String> retVal = new ArrayList<String>();
    
            retVal.add(gray + "〖" + gold + "Job Stats" + gray + "〗");
            retVal.add(dgray + " Your " + dgreen + "[" + gray + askedJob + dgreen + "]" + dgray + " stats:");
            if (PlayerCurrentJob.equalsIgnoreCase(askedJob)) {
                retVal.add(dgray + " This " + green + "is " + dgray + "your current job.");
            } else {
                retVal.add(dgray + " This " + red + "is not " + dgray + " your current job.");
            }
            retVal.add(dgray + " Current Job-Level: " + gold + PlayerJobLevel);
            retVal.add(dgray + " Current total Job-Experience: " + gold + PlayerJobExperience);
            retVal.add(dgray + " Needed experience until next LevelUp: " + gold);
            retVal.add(gray + "〖" + gold + "Job Stats" + gray + "〗");
            retVal.add("");
            return retVal;
        }
    
    Now, even though, I don't even reach for the PlayerName, I still get following Error:
    Code:
    [12:51:40 ERROR]: null
    org.bukkit.command.CommandException: Unhandled exception executing command 'arpg' in plugin arvenyonRPG v1.0
            at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[patched_1.15.2.jar:git-Paper-98]
            at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.15.2.jar:git-Paper-98]
            at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:742) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1821) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1629) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:47) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:5) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:23) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.MinecraftServer.ba(MinecraftServer.java:1038) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:1031) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeAll(IAsyncTaskHandler.java:95) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:1172) ~[patched_1.15.2.jar:git-Paper-98]
            at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:934) ~[patched_1.15.2.jar:git-Paper-98]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]
    Caused by: java.lang.NullPointerException
            at me.geekbuild.arvenyonRPG.Objects.CustomPlayer.myName(CustomPlayer.java:27) ~[?:?]
            at me.geekbuild.arvenyonRPG.Objects.CustomPlayer.<init>(CustomPlayer.java:9) ~[?:?]
            at me.geekbuild.arvenyonRPG.Main.onCommand(Main.java:30) ~[?:?]
            at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[patched_1.15.2.jar:git-Paper-98]
            ... 17 more
    Any idea, where my thinking error comes from? I am open for any suggestions. Still learning :)

    Thanks in advance!
     
    Last edited by a moderator: Feb 19, 2020
  2. Offline

    timtower Administrator Administrator Moderator

    @arvenyon Why do you have the variables at the top of the CustomPlayer class?
     
  3. Offline

    arvenyon

    Force of habit. Is this relevant?
     
  4. Offline

    timtower Administrator Administrator Moderator

    It does when you call these methods:
    Code:
    public Player Player = myPlayer();
    public String Name = myName();
    public String CurrentJob = myCurrentJob();
    public UUID UniqueID = myUUID();
    Those methods are using a variable that is null.
     
  5. Offline

    arvenyon

    Thanks. That solved it for me. I was kinda brain afk, I guess :D
     
    timtower likes this.
Thread Status:
Not open for further replies.

Share This Page