Войти или зарегистрироваться

Не работает такая вещь

  • Автор темы Автор темы Tyzun
  • Дата начала Дата начала

Tyzun

Старожил
Баллы
153
Имя в Minecraft
_Tyzun_
Пишу плагин который будет испускать фаербол если нажать мотыгой, написал вот код:
Код:
package ru.tyzun.plugin.hoefireball;
 
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.*********ventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
 
public class HoeFireBall extends JavaPlugin implements Listener {
 
    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
    }
   
    @SuppressWarnings({ "unchecked", "rawtypes" })
    @EventHandler
    public void plugin(PlayerInteractEvent e, Player user, Server server){
        ItemStack i = user.getItemInHand();
        Class type = Fireball.class;
        Action a = e.getAction();
        int speed = 2;
        if(i.getType().equals(Material.DIAMOND_HOE) || i.getType().equals(Material.GOLD_HOE) || i.getType().equals(Material.IRON_HOE) || i.getType().equals(Material.STONE_HOE) || i.getType().equals(Material.WOOD_HOE)){
            if(a == Action.LEFT_CLICK_AIR){
                Vector direction = user.getEyeLocation().getDirection().multiply(speed);
                Projectile projectile = (Projectile)user.getWorld().spawn(user.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), type);
                projectile.setShooter(user.getPlayer());
                projectile.setVelocity(direction);
            }
        }
    }
}
но оно не работает.
Подскажите, что не так я сделал?
 
Код:
public void plugin(PlayerInteractEvent e, Player user, Server server){
\/ \/ \/
public void PlayerInteractEvent (PlayerInteractEvent e){

Код:
if(a == Action.LEFT_CLICK_AIR){
\/ \/ \/
 
if(a.equals(Action.LEFT_CLICK_AIR)){
Траекторию менять не нужно. Изначально будет норм.
Последнюю ошибку найдешь сам.
 
Спавни дроп и задавай ему траекторию
 
Код:
public void plugin(PlayerInteractEvent e, Player user, Server server){
\/ \/ \/
public void PlayerInteractEvent (PlayerInteractEvent e){

Код:
if(a == Action.LEFT_CLICK_AIR){
\/ \/ \/
 
if(a.equals(Action.LEFT_CLICK_AIR)){
Траекторию менять не нужно. Изначально будет норм.
Последнюю ошибку найдешь сам.
Action можно сравнивть с пощью == , это же енумы, а вот с эвентом товарищ и правда налажал.
 
100500-е предупреждение, которое нужно кому-то выдать
@оффтоп
Время 00:01
# Мой сотый пост, нужно где то красиво разместить было)
 
Ребята, не могу никак заставить работать вот этот код:
Код:
  public void onPlayerInteract(PlayerInteractEvent event)
    {
        Player player = event.getPlayer();
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Player-Was-Interacted").toString());
       
        if(event.getAction().equals(Action.LEFT_CLICK_AIR)){
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Air").toString());}
}

Когда кликаю по чему-нибудь - выдает первое сообщение. Второе сообщение не выдает никогда.
CraftBukkit - 1.4.5.
 
LaoTheLizard, Action это enum. Попробуйте сравнивать простым сравнением - "==" (if (event.getAction() == Action.LEFT_CLICK_AIR)...)
 
Ребята, не могу никак заставить работать вот этот код:
Код:
  public void onPlayerInteract(PlayerInteractEvent event)
    {
        Player player = event.getPlayer();
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Player-Was-Interacted").toString());
      
        if(event.getAction().equals(Action.LEFT_CLICK_AIR)){
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Air").toString());}
}

Когда кликаю по чему-нибудь - выдает первое сообщение. Второе сообщение не выдает никогда.
CraftBukkit - 1.4.5.
LEFT_CLICK_AIR, на сколько я помню, выдаётся при ударе мечём по воздуху.
 
Ну вообще изначально я так и делал. А цитата кода, которую я привел выше - это после попытки сделать так, как предлагал выше Jampire. Не работает ни то, ни другое. Плагин решительно не отзывается на клик по воздуху. Ни на левый, ни на правый.

Что делать, люди? Плагин хороший пропадает...
 
Я скачал плагин - он работает с ошибками. Решил декомпилировать и доточить его сам (исходников нет на страничке плагина). И там был подобный кусок кода. Фишка в том, что изначально этот плагин у меня реагировал на клик по воздуху. А если декомпилировать и обратно собрать - уже не работает ни фига. Получается, что при декомпилировании что-то потерялось или было разобрано с ошибкой. Помогите.
 
Я скачал плагин - он работает с ошибками. Решил декомпилировать и доточить его сам (исходников нет на страничке плагина). И там был подобный кусок кода. Фишка в том, что изначально этот плагин у меня реагировал на клик по воздуху. А если декомпилировать и обратно собрать - уже не работает ни фига. Получается, что при декомпилировании что-то потерялось или было разобрано с ошибкой. Помогите.
Декомпиляция - неблагодарное дело. Она никогда не восстанавливает 100% сорцев.
В любом случае нужно сделать такие веши:

1) посмотреть в логи компилятора. Возможно он и не компилируется вовсе. Возможно есть очень важные предупреждения, которые он выдал. Конечно, это можно приложить тут в спойлер.

2) Посмотреть, загружен ли плагин вообще. Для этого есть команда /plugins

3) Самое основное! Открыть логи сервера. Внимательно прочитать. Если найдутся сообщения об ошибках - прочитать еще внимательнее и постараться найти баг. (обычно бывает написано "Exception at [$строка:$столбец]" ) Вообще в логах содержится 99% полезной информации. Поэтому было бы не плохо логи приложить к сообщению в спойлере (хотя бы отрывок лога с ошибкой)

4) Приложить исходники. Нужно прикладывать не отрывок кода (функцию, метод), а весь файл целиком, с нумерацией строк.
[spoiler][code=java]можно вставить код так[/code][/spoiler]
или же воспользоваться услугами сайта pastebin.com

UPD:
5) Научитесь использовать обычный дебаггер! Он сильно экономит время при поиске ошибки.
Было бы здорово поставить программу на паузу, и посмотреть какие значения хранятся в переменных, верно?!
 
Последнее редактирование:
Декомпиляция - неблагодарное дело. Она никогда не восстанавливает 100% сорцев.
В любом случае нужно сделать такие веши...
1. Компилятор не ругается. Вообще.
2. Команда /plugins выдает, что плагин загружен. Впрочем, появление при клике по блоку фразы "Player-Was-Interacted", по-моему, куда красноречивее этой команды. Плагин работает и откликается на первое условие - наличие event. Но только если кликать по блоку. Если кликать по воздуху - фраза не появляется, процедура вообще не запускается. А ведь должна.
3. Самое основное находится у меня перед глазами всегда. Потому что сервер работает в консоли в соседнем окне моего монитора. И там нет сообщений об ошибках. Не только связанных с этим плагином, но и вообще никаких ошибок нет.
4. В данном случае речь идет даже не о целом плагине, а об этой конкретной процедуре. И весь код сюда вытаскивать совсем необязательно для того, чтобы обсуждать вопрос. Потому что по коду, по-моему, очевидно, что он никак не зависит от соседних процедур плагина - по крайней мере, в том виде, в котором я сюда его привёл.
5. Не спорю. Но разве в моем коде недостаточно меток, чтобы при работе процедуры понять, что она работает не так, как ожидается? И понять, что значение переменной Action не принимает значения LEFT_CLICK_AIR, когда я произвожу при тестировании LEFT_CLICK_AIR, исходя из того, что процедура не запускается, когда я кликаю по воздуху?
 
5. Не спорю. Но разве в моем коде недостаточно меток, чтобы при работе процедуры понять, что она работает не так, как ожидается? И понять, что значение переменной Action не принимает значения LEFT_CLICK_AIR, когда я произвожу при тестировании LEFT_CLICK_AIR, исходя из того, что процедура не запускается, когда я кликаю по воздуху?
Java:
public void onPlayerInteract(PlayerInteractEvent event){
        System.out.println(event.getAction());
        System.out.println(event.getAction() == Action.LEFT_CLICK_AIR);
        Player player = event.getPlayer();
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Player-Was-Interacted").toString());
       
        if(event.getAction().equals(Action.LEFT_CLICK_AIR)){
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Air").toString());}
}
вот очень грубый способ диагностики.
 
Ребятки, а вы @EventHandler не забыли?)
 
Jampire, нет. Если бы забыли, по моему опыту, процедура вообще не работала бы.

DPOH-VAR, вставил я эти строки. Сделал такой блок:
Код:
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)

    public void onPlayerInteract(PlayerInteractEvent event)
    {
        System.out.println(event.getAction());
        System.out.println(event.getAction() == Action.LEFT_CLICK_AIR);
       
        Player player = event.getPlayer();
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Player-Was-Interacted").toString());
       
        if(event.getAction() == (Action.LEFT_CLICK_AIR)){
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Air").toString());}
       
        if(event.getAction() == (Action.RIGHT_CLICK_AIR)){
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Right-Clicked-Air").toString());}
       
        if(event.getAction() == (Action.LEFT_CLICK_BLOCK)){
        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Block").toString());}
       
        if(event.getAction() == (Action.RIGHT_CLICK_BLOCK)){
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Right-Clicked-Block").toString());}
}

На экране в игре только : "Left-Click-Block", "Right-Click-Block", "Player-Was-interacted".
В консоли только: "LEFT_CLICK_BLOCK", "RIGHT_CLICK_BLOCK" и "false".
Не видит эта процедура событий клика по воздуху. Вообще. Видимо, это нужно прослушивать каким-то другим методом.
 
Назад
Верх