嘿所以我在发布之前确实在多个网站上看到了这个问题并且我做的一切都是正确的,但是当我尝试加载我的插件时仍然会出现此错误,它说错误无法 无效的plugin.yml,然后只是给出了一堆代码行和东西(我假设从bukkit文件中的代码和诸如此类的东西,是的,我的plugin.yml保存在src文件夹而不是包中,并且当我导出它时,我将它导出为.jar,无论如何这里是我的plugin.yml文件
name: ProtHome
main: com.yahoo.m1kesanders.ProtHome.ProtHome
version: 1.0.0
Description: A simple /home plugin
commands:
sethome:
Description: sets players home
home:
Description: teleports player to their home
我也确实使用了4个空格,命令后没有使用两个空格键:在每个命令后再使用两个空格
这里是我在eclipse中插件的代码,以防你需要它来检查名称和什么不是
package com.yahoo.m1kesanders.ProtHome;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
public class ProtHome extends JavaPlugin{
public static ProtHome plugin;
public File folder = plugin.getDataFolder();
public static File file = new File("Homes.yml");
public static YamlConfiguration Homes = new YamlConfiguration();
public void onEnable(){
if(!folder.exists()){
folder.mkdir();
}
if(!file.exists()){
file.mkdir();
}
try {
Homes.load(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public boolean onCommand(CommandSender cmdsender, Command cmd, Player player) throws FileNotFoundException, IOException, InvalidConfigurationException{
if(cmdsender.equals("sethome")){
ProtHome.Homes.load(ProtHome.file);
Homes.set(player.getName() + ".x", player.getLocation().getBlockX());
Homes.set(player.getName() + ".y", player.getLocation().getBlockY());
Homes.set(player.getName() + ".z", player.getLocation().getBlockZ());
Homes.set(player.getName() + ".world", player.getWorld().getName());
ProtHome.Homes.save(ProtHome.file);
}
else if(cmdsender.equals("home")){
int x = (int) Homes.get(player.getName() + ".x");
int y = (int) Homes.get(player.getName() + ".y");
int z = (int) Homes.get(player.getName() + ".z");
String world = (String) Homes.get(player.getName() + ".world");
World realworld = Bukkit.getServer().getWorld(world);
Location loc = new Location(realworld,x,y,z);
player.teleport(loc);
}
return false;
}
}
如果你们可以帮助我,那将意味着非常感谢阅读
答案 0 :(得分:3)
部分问题可能是您在bukkit示例plugin.yml中将D
中的Description:
大写,所有键都是小写的。
尝试使用小写d
导出虽然这可能不是问题,但使用正确的编码语法总是有帮助的。 Bukkit用它的yaml解析器非常挑剔。
此外,为了将来参考,通常包名不包含大写字母,只包含类。
您的资料包com.yahoo.m1kesanders.ProtHome
大多数套餐com.yahoo.m1kesanders.prothome
我无法确定,但通常特别建议bukkit插件遵循此一般规则。我不知道bukkit的类加载器是如何工作的,但这个大写的包名肯定没有帮助。
答案 1 :(得分:1)
除了TheJavaCoder16所说的,你似乎也没有使用正确的onCommand
方法。这就是你所拥有的(不包括throws ...
和主要内容):
public boolean onCommand(CommandSender cmdsender, Command cmd, Player player)
正确的方法是:
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
让玩家检查sender instanceof Player
是否然后将发件人转发给Player
:
if (sender instanceof Player) {
Player player = (Player) sender;
//Rest of your code goes here
}
您还应该警惕的是返回false
会向发件人发送错误,警告他们错误/无效使用该命令。您应该尝试返回true,除非您希望它发送此消息。
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) throws FileNotFoundException, IOException, InvalidConfigurationException{
if (sender instanceof Player) {
Player player = (Player) sender;
if(cmdsender.equals("sethome")){
ProtHome.Homes.load(ProtHome.file);
Homes.set(player.getName() + ".x", player.getLocation().getBlockX());
Homes.set(player.getName() + ".y", player.getLocation().getBlockY());
Homes.set(player.getName() + ".z", player.getLocation().getBlockZ());
Homes.set(player.getName() + ".world", player.getWorld().getName());
ProtHome.Homes.save(ProtHome.file);
} else if(cmdsender.equals("home")){
int x = (int) Homes.get(player.getName() + ".x");
int y = (int) Homes.get(player.getName() + ".y");
int z = (int) Homes.get(player.getName() + ".z");
String world = (String) Homes.get(player.getName() + ".world");
World realworld = Bukkit.getServer().getWorld(world);
Location loc = new Location(realworld,x,y,z);
player.teleport(loc);
}
}
return true;
}
答案 2 :(得分:0)
通常,你可以从字面上做正确的事情,但它仍然会抛出错误或异常。这可能看起来像一个愚蠢的答案,但是你在导出它之前刷新了plugin.yml
文件吗?这通常会发生,并且比您想象的更常见。