minecraft forge — как мне получить объект и изменить его состояние?

Я начинаю с моддинга кузницы и хочу сделать так, чтобы все криперы появлялись как заряженные крипера. Я использую forge MDK 1.16.3.

Вот мой обработчик событий:

  package com.modder.mod.events; import net  .minecraft.entity.Entity; import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; открытый класс EventHandler {@SubscribeEvent public static void mobEvent (событие LivingSpawnEvent) {Entity entity;  }}  

Но я не знаю, что делать после этого. Заранее благодарим!


LivingSpawnEvent будет срабатывать каждый раз, когда сущность порождается в мире, в том числе когда вы уходите и затем возвращаетесь, поэтому имейте это в виду.

Поскольку событие запускается для каждой порождающейся сущности, мы хотим проверить, является ли эта сущность криперами, и поэтому мы проверяем, что это экземпляр CreeperEntity class и вернуть, если это не так.

  if (! (event.getEntity () instanceof CreeperEntity)) return;  

Теперь, когда мы знаем, что у нас есть крипер, мы можем безопасно использовать его, чтобы получить сущность крипера. Затем мы проверяем, заряжен ли крипер, и возвращаем его, если это так; так как нет необходимости продолжать.

  CreeperEntity creeper = (CreeperEntity) event.getEntity (); if (creeper.isCharged ()) return;  

Обычно криперы заряжаются от удара молнии, и мы можем эмулировать эту функцию, чтобы заставить крипера заряжаться:

  LightningBoltEntity lightningBoltEntity = new LightningBoltEntity (event.getWorld  () .getWorld (), event.getX (), event.getY (), event.getZ (), true); ((ServerWorld) event.getWorld ()). addLightningBolt (lightningBoltEntity); creeper.onStruckByLightning (lightningBoltEntity)  ;  

Этот удар повредит лианы.

Однако, если мы не хотим удара молнии, мы должны изменить POWERED диспетчер данных логическое. Это поле является частным, но мы можем использовать отражение.

Сначала мы определяем новое поле , а затем пытаемся получить POWERED и сделайте его доступным.

  Поле поля; field = creeper.getClass (). getDeclaredField ("POWERED"); field.setAccessible (true);  

Затем мы можем установить значение true, что приведет к зарядке крипера.

  DataParameter  powered = (DataParameter ) field.get (creeper); creeper.getDataManager (). set (powered, true);  

Наконец, мы должны заключить это в try/catch, потому что мы не t контролировать содержимое CreeperEntity , поэтому мы не можем гарантировать, что наши предположения о его содержимом будут точными при выполнении, поэтому мы определяем, как мы будем поступать с ошибками. В этом случае я игнорирую любые ожидаемые исключения в демонстрационных целях.

  @SubscribeEventpublic void autoChargeCreeper (LivingSpawnEvent event) {if (! (Event. getEntity () instanceof CreeperEntity)) return;  CreeperEntity creeper = (CreeperEntity) event.getEntity ();  если (creeper.isCharged ()) вернуться;  попробуйте {Поле поля;  поле = creeper.getClass (). getDeclaredField ("ВЫКЛЮЧЕНО");  field.setAccessible (правда);  DataParameter  powered = (DataParameter ) field.get (ползунок);  creeper.getDataManager (). set (питание, истина);  } catch (NoSuchFieldException | IllegalAccessException игнорируется) {}}  

Оцените статью
Gamicon.ru
Добавить комментарий