我正在尝试在config.yml中保存一个位置,当他走到该位置时,它会引发一个动作。但是,这种情况并没有发生。
很抱歉包含整个代码,但我认为这对于此类程序至关重要。
主要课程:
coalesce(itp.PVALUE, cast(0 as float))
听众课程:
public class Turrets extends JavaPlugin{
ArrayList<String> playersThatShouldPlaceBlock = new ArrayList<String>();
HashMap<String, String> turretName = new HashMap<String, String>();
String turretsMsg = ChatColor.RED + "[" + ChatColor.GOLD + "Turrets" + ChatColor.RED + "]" + ChatColor.GOLD + ": ";
public int waitForPlacement;
public void loadConfig() {
this.getConfig().addDefault("Turrets.", null);
this.saveConfig();
}
public void onEnable(){
new CreateTurretEvent(this);
loadConfig();
}
public void onDisable(){
loadConfig();
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
final Player p = (Player) sender;
if (cmd.getName().equalsIgnoreCase("turret")){
if (args.length < 2){
p.sendMessage(turretsMsg + ChatColor.RED + "Invalid usage! /turret [create or delete] [name]");
return true;
}
else if (args.length >= 2){
if (args[0].equalsIgnoreCase("create")){
if (args[1] != null){
p.sendMessage(turretsMsg + ChatColor.GOLD + "Place a block and YOU will become a turret when you step on it!");
playersThatShouldPlaceBlock.add(p.getName());
turretName.put(p.getName(), args[1]);
waitForPlacement = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
@Override
public void run() {
p.sendMessage(turretsMsg + ChatColor.RED + "You waited too long so the action was cancelled!");
playersThatShouldPlaceBlock.remove(p.getName());
}
}, 600L);
return true;
}
}
}
}
return false;
}
}
答案 0 :(得分:1)
问题1:拼写错误(此问题已在question revision 3处无法修改
你好像拼错了onDisbale(){
。当一个插件被禁用时,它将在你的插件上运行方法onDisable()
。在您的情况下,它不会运行,因为您没有具有该确切签名的方法。
将来如何防止这种情况
通过在方法的开头添加@Override
,你说它必须覆盖在父类中找到的现有方法。这可以像:
@Override
public void onDisable() {
问题2:PlayerMoveEvent的实现尚未完成
请注意,stackoverflow不是“我们为您服务编写代码”
通过分析您的代码,您将按以下格式保存配置:
playername:
turretname: (location object)
第1步:更改位置保存
bukkit配置无法与Location对象一起使用,您应该将位置保存更改为
getter.getConfig().set("Turrets." + getter.turretName.get(p.getName())+ ".world", player.getLocation().getWorld().getName());
getter.getConfig().set("Turrets." + getter.turretName.get(p.getName())+ ".x", player.getLocation().getBlockX());
getter.getConfig().set("Turrets." + getter.turretName.get(p.getName())+ ".y", player.getLocation().getBlockY());
getter.getConfig().set("Turrets." + getter.turretName.get(p.getName())+ ".z", player.getLocation().getBlockZ());
这会更改配置以分别存储x,y和z世界
第2步:在PlayerMoveEvent解析配置
因为我们更改了配置格式,所以在PlayerMoveEvent中检测我们所站的炮塔会更容易
我们将采用以下方法来检测我们在PlayerMove上站着什么块
检查配置中是否存在炮塔
ConfigurationSection sec = getter.getConfig().getConfigurationSection("Turrets."+getter.turretName.get(p.getName()));
// Todo: check if the player exists inside getter.turretName
if(sec != null){
....
}
解析配置以检查是否找到了位置
Location loc = event.getPlayer().getLocation();
if(loc.getBlockX() == sec.getInt("x") && loc.getBlockY() == sec.getInt("y") && loc.getBlockZ() == sec.getInt("z") && loc.getWorld().getName().equals(sec.getString("world"))) {
event.getPlayer().sendMessage("This is a test");
}
这应该可以解决您遇到的问题。可以进行以下改进:
getter
应重命名为main
或plugin