Помогите Возможно ли сверить тип моба?

konfyciu98

Старожил
Пользователь
Баллы
123
Имя в Minecraft
konfyciu
Должно быть что-то типо такого:
Код:
@EventHandler
   public void onInteractEntity(PlayerInteractEntityEvent event) {
     EntityType entity = event.getRightClicked().getType();
        {
         if(entity instanceof Cow) {
           //blabla
         }
     }
   }
Возможно ли это в этом обработчике событий?
Просто в PlayerDeathEvent есть getDamager и getKiller, которые относятся к классу Player(killer instanceof Player). А вот в PlayerInteractEntityEvent можно ли определить класс энтити?
 
Тебе именно instanceof нужно использовать? Можно же через EntityType проверить.
И вот скорее правильный код:
Код:
@EventHandler
  public void onInteractEntity(PlayerInteractEntityEvent event) {
    Entity e = event.getEntity();
        {
        if(e instanceof Cow) {
          //blabla
        }
    }
  }
Вот с EntityType
Код:
@EventHandler
  public void onInteractEntity(PlayerInteractEntityEvent event) {
    EntityType eType = event.getEntity().getType();
        {
        if(eType == EntityType.COW) {
          //blabla
        }
    }
  }
 
Код:
org.bukkit.event.EventException
   at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
   at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
   at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:30)
   at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:478)
   at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:463)
   at net.minecraft.server.v1_6_R3.PlayerConnection.a(PlayerConnection.java:1125)
   at net.minecraft.server.v1_6_R3.Packet7UseEntity.handle(SourceFile:36)
   at org.spigotmc.netty.NettyNetworkManager.b(NettyNetworkManager.java:230)
   at net.minecraft.server.v1_6_R3.PlayerConnection.e(PlayerConnection.java:117)
   at net.minecraft.server.v1_6_R3.ServerConnection.b(SourceFile:37)
   at org.spigotmc.netty.NettyServerConnection.b(NettyServerConnection.java:132)
   at net.minecraft.server.v1_6_R3.MinecraftServer.t(MinecraftServer.java:594)
   at net.minecraft.server.v1_6_R3.DedicatedServer.t(DedicatedServer.java:240)
   at net.minecraft.server.v1_6_R3.MinecraftServer.s(MinecraftServer.java:483)
   at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:415)
   at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583)
Caused by: java.lang.NullPointerException
   at me.konfyciu.Passenger.Passenger.onInteractEntity(Passenger.java:55)
   at sun.reflect.GeneratedMethodAccessor326.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:606)
   at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
   ... 15 more

А первый твой способ не робит, ибо можно определить только Type и id энтити.
 
Код:
org.bukkit.event.EventException
   at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
   at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
   at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:30)
   at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:478)
   at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:463)
   at net.minecraft.server.v1_6_R3.PlayerConnection.a(PlayerConnection.java:1125)
   at net.minecraft.server.v1_6_R3.Packet7UseEntity.handle(SourceFile:36)
   at org.spigotmc.netty.NettyNetworkManager.b(NettyNetworkManager.java:230)
   at net.minecraft.server.v1_6_R3.PlayerConnection.e(PlayerConnection.java:117)
   at net.minecraft.server.v1_6_R3.ServerConnection.b(SourceFile:37)
   at org.spigotmc.netty.NettyServerConnection.b(NettyServerConnection.java:132)
   at net.minecraft.server.v1_6_R3.MinecraftServer.t(MinecraftServer.java:594)
   at net.minecraft.server.v1_6_R3.DedicatedServer.t(DedicatedServer.java:240)
   at net.minecraft.server.v1_6_R3.MinecraftServer.s(MinecraftServer.java:483)
   at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:415)
   at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583)
Caused by: java.lang.NullPointerException
   at me.konfyciu.Passenger.Passenger.onInteractEntity(Passenger.java:55)
   at sun.reflect.GeneratedMethodAccessor326.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:606)
   at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
   ... 15 more

А первый твой способ не робит, ибо можно определить только Type и id энтити.
Может первый не работает, потому что ты в entity и тип его еще получаешь?! Удали это и будет все хорошо. :confused:
 
Может первый не работает, потому что ты в entity и тип его еще получаешь?! Удали это и будет все хорошо. :confused:
Что? Я ничего не понял.
Вот мой код. Ошибку выдает на if( entity == EntityType.SPIDER)
Код:
  @EventHandler
   public void onInteractEntity(PlayerInteractEntityEvent event) {
     EntityType entity = event.getRightClicked().getType();
        {
         if( entity == EntityType.SPIDER) {
           //blooo
         }
     }
   }
А я хочу сверять тип Entity через instanceof
 
А я хочу сверять тип Entity через instanceof
Сверять-то можно и при помощи instanceof, только зачем? Насколько я помню instanceof очень медленный оператор по сравнению со сравнением enum'ов. Понятно, что с точки зрения нынешних производительностей и мощностей это фигня, но даже чисто с эстетической точки зрения конструкция entity.getType()==EnityType.SPIDER симпатичнее чем entity instanceof Spider (ну или как там класс паучинный называется ;))
 
Сверять-то можно и при помощи instanceof, только зачем? Насколько я помню instanceof очень медленный оператор по сравнению со сравнением enum'ов. Понятно, что с точки зрения нынешних производительностей и мощностей это фигня, но даже чисто с эстетической точки зрения конструкция entity.getType()==EnityType.SPIDER симпатичнее чем entity instanceof Spider (ну или как там класс паучинный называется ;))
Я решил попробовать такой метод, ибо хочу убрать эту ошибку.
Может он поможет, может не поможет...хз
 
Код:
@EventHandler
  public void onInteractEntity(PlayerInteractEntityEvent event) {
    Entity entity = event.getRightClicked();
     
        if(entity instanceof Cow) {
          Cow cow = (Cow) entity;
          cow.getWorld().createExplosion(cow.getLocation(), 10);
        }
 
  }
Не люблю пользоваться EntityType , так как там в нужный момент нету LivingEntity и приходится все прописывать в ручную.
 
Последнее редактирование:
Для людей, использующих instanceof в аду есть отдельный котел.
 
Для людей, использующих instanceof в аду есть отдельный котел.
С чего бы это?
instanceof на HotSpotVM между прочим очень быстрая операция.

А типы лучше не сравнивать если вы не знаете кода всех остальных плагинов которые стоят у вас, а также если вы работаете на mcpc+, потому что тут запросто пожет оказаться что getType вернёт null или что ещё похуже(Привет всем плагинам который использовали какой-то древний гайд для создания кастомных энтитей. Там getType возвращал null)
 
Последнее редактирование:
Код:
@EventHandler
  public void onInteractEntity(PlayerInteractEntityEvent event) {
    Entity entity = event.getRightClicked();
    
        if(entity instanceof Cow) {
          Cow cow = (Cow) entity;
          cow.getWorld().createExplosion(cow.getLocation(), 10);
        }

  }
Не люблю пользоваться EntityType , так как там в нужный момент нету LivingEntity и приходится все прописывать в ручную.

Может коровку стоит перед этим убить?
 
Для людей, использующих instanceof в аду есть отдельный котел.
И как же, к примеру проверить, что определённый объект реализует интерфейс или наследует определённый класс, если метода\поля, который явно указывал бы на тип объекта нет?
Делать приведение и заворачивать в try-catch? В эту самую тормозную операцию?

С чего бы это?
instanceof на HotSpotVM между прочим очень быстрая операция.
Если имеется нужна в использовании instanceof - ооп используется не правильно.
 
Код:
@EventHandler
  public void onInteractEntity(PlayerInteractEntityEvent event) {
    Entity entity = event.getRightClicked();
    
        if(entity instanceof Cow) {
          Cow cow = (Cow) entity;
          cow.getWorld().createExplosion(cow.getLocation(), 10);
        }

  }
Не люблю пользоваться EntityType , так как там в нужный момент нету LivingEntity и приходится все прописывать в ручную.
На этот случай есть ещё isAlive() у EntityType. А по поводу instanceof в PlayerInteractEvent -- есть безусловно те случаи, когда без этого не обойтись, но я не считаю что это тот самый случай. Для MCPC+ тут можно и по другому пути пойти, хотя эта ситуация напоминает мне ситуацию с событиями, когда моды их не кидают.
 
Назад
Верх