位置未保存到config.yml

时间:2015-09-07 16:10:55

标签: bukkit

我正在尝试在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;
    }

}

1 个答案:

答案 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上站着什么块

  1. 检查配置中是否存在炮塔

    ConfigurationSection sec = getter.getConfig().getConfigurationSection("Turrets."+getter.turretName.get(p.getName())); 
    // Todo: check if the player exists inside getter.turretName
    if(sec != null){
        ....
    }
    
  2. 解析配置以检查是否找到了位置

    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");
    }
    
  3. 这应该可以解决您遇到的问题。可以进行以下改进:

    • 播放器更改块时仅调用播放器移动代码
    • 使用更具描述性的变量名称,例如getter应重命名为mainplugin