2016-05-22 31 views
-6

我有一个配置文件Homes.yml,我正在使用服务器上的用户存储区,以便能够在重新加载之间传送。目前,/ksethome命令正在工作,配置文件使用正确的坐标进行更新。用于玩家不允许远距传送的Java bukkit配置文件

但是,执行/khome命令时会引发错误。

这里是Homes.yml

Homes: 
    Kalenpw: 
    ==: org.bukkit.Location 
    yaw: 174.53154 
    pitch: 18.115198 
    z: 89.15419690166142 
    y: 100.0 
    world: Khalidor 
    x: 99.43791494211929 

副本,这里是一个插件的拷贝

//@kalenpw 

package com.Khalidor.testplugin; 

import java.util.HashMap;  
import org.bukkit.Bukkit; 
import org.bukkit.ChatColor; 
import org.bukkit.Location; 
import org.bukkit.World; 
import org.bukkit.command.Command; 
import org.bukkit.command.CommandSender; 
import org.bukkit.entity.Player; 
import org.bukkit.plugin.java.JavaPlugin; 
import org.bukkit.event.EventHandler; 
import org.bukkit.event.Listener; 
import org.bukkit.event.player.PlayerJoinEvent; 
import org.bukkit.inventory.PlayerInventory; 

public final class TestPlugin extends JavaPlugin implements Listener { 
    MyConfigManager manager; 
    MyConfig homesConfig; 
    HashMap<String, Location> playerHomes = new HashMap<String, Location>(); 

    @Override 
    public void onEnable() { 

     getLogger().info("onEable has been invoked!"); 
     getServer().getPluginManager().registerEvents(this, this); 
     manager = new MyConfigManager(this); 
     homesConfig = manager.getNewConfig("Homes.yml"); 

     // TODO add stuff to hashmap onEnable() 

    } 

    @Override 
    public void onDisable() { 
     // when plugin is disabled 
     getLogger().info("onDisable has been invoked"); 


    } 




    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
     if (sender instanceof Player) { 
      Player user = (Player) sender; 

      // Sethome 
      if (label.equalsIgnoreCase("KSetHome")) { 

       playerHomes.put(user.getName(), user.getLocation()); 
       homesConfig.set("Homes." + user.getName(), user.getLocation()); 
       homesConfig.saveConfig(); 
       user.sendMessage(ChatColor.GOLD + "Set home!"); 

      } 
      // TP home 
      if (label.equalsIgnoreCase("KHome")) { 

       // Location homeLocation = playerHomes.get(user.getName()); 
       /* 
       * Location homeLocation = homesConfig.get("Homes." + 
       * user.getName(),); 
       */ 
       String worldName = homesConfig.getString("Homes." + user.getName() + ".world"); 
       World homeWorld = Bukkit.getServer().getWorld(worldName); 
       double homeX = homesConfig.getDouble("Homes." + user.getName() + ".x"); 
       double homeY = homesConfig.getDouble("Homes." + user.getName() + ".y"); 
       double homeZ = homesConfig.getDouble("Homes." + user.getName() + ".z"); 
       Location homeLocation = new Location(homeWorld, homeX, homeY, homeZ); 
       user.teleport(homeLocation); 
       user.sendMessage(ChatColor.GOLD + "Teleported home!"); 

      } 
      return true; 
     } 
     // Not executed by player 
     return false; 

    } 

} 

最后是错误的副本:

[21:25:01 INFO]: Kalenpw issued server command: /ksethome 
[21:25:04 INFO]: Kalenpw issued server command: /khome 
[21:25:04 ERROR]: null 
org.bukkit.command.CommandException: Unhandled exception executing command 'khome' in plugin TestPlugin v1.0 
     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at org.bukkit.craftbukkit.v1_9_R1.CraftServer.dispatchCommand(CraftServer.java:645) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.PlayerConnection.handleCommand(PlayerConnection.java:1350) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:1185) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [?:1.7.0_85] 
     at java.util.concurrent.FutureTask.run(FutureTask.java:262) [?:1.7.0_85] 
     at net.minecraft.server.v1_9_R1.SystemUtils.a(SourceFile:45) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:721) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:400) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:660) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:559) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at java.lang.Thread.run(Thread.java:745) [?:1.7.0_85] 
Caused by: java.lang.IllegalArgumentException: Name cannot be null 
     at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at org.bukkit.craftbukkit.v1_9_R1.CraftServer.getWorld(CraftServer.java:1022) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     at com.Khalidor.testplugin.TestPlugin.onCommand(TestPlugin.java:152) ~[?:?] 
     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a] 
     ... 15 more 

我已经做了一些谷歌搜索,似乎无法弄清楚我做错了什么。从我可以告诉我创建位置对象从Homes.yml错误,因为我可以切换代码只使用一个哈希映射,它工作正常,这也消除了plugin.yml作为问题。谢谢您的帮助!

编辑:

从TestPlugin.java

152线
World homeWorld = Bukkit.getServer().getWorld(worldName); 

编辑:

显然这个问题是每一个方式,我已经走了约让我的世界返回null。我用Bukkit.broadcastMessage(Bukkit.getWorlds().toString());进行检查,以确保我使用正确的字符串从广播中获取世界并广播[CraftWorld{name=Khalidor}, CraftWorld{name=Khalidor_nether}, CraftWorld{name=Khalidor_the_end}]我不处于虚空或最终状态因此,在我看来,它应该在拾取这个世界。

当我运行这些String worldName = homesConfig.getString("Homes." + user.getName() + ".world"); Bukkit.broadcastMessage(worldName);

我得到这么不管是什么原因,我得到空回,而不是我的世界名的空指针异常。还在搞清楚为什么会这样。

编辑:

所以我想通了,这个问题是我的YML文件,而不是使用从Homes.yml我刚刚进入我的世界的字符串,字符串,现在所有读取XYZ位置为0所以出于某种原因,它读错了。

编辑:解决了这个问题不在YML文件中,但我有一行代码留在了早期的测试中,导致了YML的问题,因为我保存了x y z然后覆盖了一个位置。

+0

TestPlugin.java line 152 ...它是什么? –

+0

@ cricket_007 World homeWorld = Bukkit.getServer()。getWorld(worldName); – kalenpw

+0

并且“IllegalArgumentException:名称不能为空”意味着什么给你? –

回答

1

在尝试使用它之前,您可能需要检查“homesConfig.contains(”Homes。“+ user.getName()+)”“。我认为配置文件不包含的东西只会返回null。
这里是你如何可以检查它

if (!homesConfig.contains("Homes." + user.getName() + ".world") || <just copy the first condition but for the different elements, like x, y, z, ect>) { 
    user.sendMessage(ChatColor.RED + "No home set"); 
    return true; 
} 

我没有测试此代码,但它可以工作。另外pogostick29dev有很多bukkit教程,其中一个涵盖了设置管理器,如果你想检查他。

+0

这是一个好主意,我会实现这一点。如果什么都没有发生,那么它们会返回null,这将导致玩家无法返回世界返回null,并且x y z都返回0.任何想法如何解决这个问题?我的语法看起来是正确的,基于我一直在观看的AppleJuze教程 – kalenpw

+0

X y和z可能返回0,因为它们是整数而不是对象,所以它们不能为空,它只是将它们设置为最接近的它们可以是null。 –

+0

是的,我不知道为什么他们没有在文件中找到。当我将这个位置保存到Homes.yml时,我最终得到了一些旧的代码行,在删除了tp后,它正在与之混淆。我会在实施检查时接受您的答案,如果设置了家庭,那么我会注意到错误。谢谢 – kalenpw

0

(未测试)

在管线152:

String worldName = homesConfig.getString("Homes." + user.getName() + ".world"); 

应该是

World homeWorld = ((Location) getConfig().get("Homes." + user.getName())).getWorld(); 

为什么呢?

您存储位置的线

homesConfig.set("Homes." + user.getName(), user.getLocation());

所以,你必须检索位置。然后您可以获得该地点的世界。

此外,你不应该使用球员的名字,因为你可以在mojangs网站上更改你的名字。改用播放器的UID。

+0

UUID上的优点我没有想到。然而,在改变第152行之后,我仍然得到一个空指针异常。引起:java.lang.NullPointerException at com.Khalidor.testplugin.TestPlugin.onCommand(TestPlugin.java:151)〜[?:?] note:I delted一条线如此151仍然是这里问题的线 – kalenpw