Вызов метода экземпляра PlayerMoveEvent

Я просто пытаюсь вызвать метод, но я немного растерялся из-за того, как это сделать с параметрами, которые мне нужно использовать из Bukkit API.

Метод, который я вызываю:

@EventHandler   
    private void onPlayerMove(PlayerMoveEvent event) {
        Player player = event.getPlayer();
        Location location = loc.get(player.getName());
        if (player.getLocation().distance(location) >= 65) {
            player.sendMessage(ChatColor.AQUA + "Out of reach.");
        }
    }

Метод, из которого я его вызываю:

public boolean onCommand(CommandSender sender, Command cmd, String commandlabel, String[] args) {
    this.onPlayerMove(PlayerMoveEvent);
}

Любая помощь очень ценится!

1 ответ

Решение

Вам не нужно вызывать события, они автоматически запускаются, когда событие происходит. Например,

@EventHandler   
public void onPlayerMove(PlayerMoveEvent event){
}

Будет вызван, когда игрок движется. Вам НИКОГДА не нужно будет называть событие.

Если вы пытаетесь телепортировать игрока, вы можете использовать:

Player p; //make sure that 'p' is assigned to something
Location l = new Location(world, x-coord, y-coord, z-coord);

p.teleport(l);

Итак, что вы действительно должны делать, учитывая, что это все в вашем основном файле:

@Override
public void onEnable(){
    //plugin enabled
    this.getServer().getPluginManager().registerEvents(this, this);
}

@Override
public void onDisable(){
    //plugin disabled
}

@EventHandler   
public void onPlayerMove(PlayerMoveEvent event){ //NEVER make events with the private modifier
    Player player = event.getPlayer();
    Location location = loc.get(player.getName()); //I really don't know what your trying to do here
    //if your trying to create a new location, check out the code above
    if(player.getLocation().distance(location) >= 65) {
        player.sendMessage(ChatColor.AQUA + "Out of reach.");
    }
}

Ваш onPlayerMove метод будет вызываться всякий раз, когда игрок двигается, никакой дополнительной работы не требуется!

Кроме того, убедитесь, что player.getLocation().distance(location) на самом деле работает, так как это не метод в Bukkit... Я предполагаю, что вы получите расстояние между местоположением игрока, и location, проверив игроков X, Y, а также Z Coords...

Просто убедитесь, что класс, в который вы помещаете событие в implements Listener

Кроме того, если вы хотите поместить событие в класс, отличный от вашего основного файла, зарегистрируйте события в вашем onEnable(), использовать этот:

this.getServer().getPluginManager().registerEvents(new classNameHere(), this);

Если это в вашем основном файле, вы можете заменить new classNameHere() с this

Хотя в последний раз, и я не могу не подчеркнуть, насколько это важно, вам НИКОГДА не нужно вызывать методы вашего события. Пока события регистрируются (сделано в коде выше), а методы имеют @EventHandler над ними. События ВСЕГДА будут вызываться автоматически всякий раз, когда событие происходит

Другие вопросы по тегам