我从锻造模型开始,我想让所有的爬行动物都像带电的爬行动物一样产卵。我使用的是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;
public class EventHandler
{
@SubscribeEvent
public static void mobEvent(LivingSpawnEvent event)
{
Entity entity;
}
}但我不知道这之后该做什么。提前感谢!
发布于 2020-09-12 08:40:45
LivingSpawnEvent将在每次实体生成到一个世界时触发,这包括你离开和返回的时间,所以请记住这一点。
由于每个生成实体都会触发该事件,因此我们希望检查该实体是否是爬行器,因此我们检查它是否是CreeperEntity类的实例,如果不是,则返回。
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数据管理器布尔值。这个字段是私有的,但是我们可以使用reflection。
首先,我们定义一个新的Field,然后尝试获取POWERED字段并将其设置为accessible。
Field field;
field = creeper.getClass().getDeclaredField("POWERED");
field.setAccessible(true);然后,我们可以将该值设置为true,这会将爬行器设置为带电。
DataParameter<Boolean> powered = (DataParameter<Boolean>) field.get(creeper);
creeper.getDataManager().set(powered, true);最后,我们应该把它包装在一个try/catch中,因为我们不能控制CreeperEntity的内容,所以我们不能保证我们对其内容的假设在执行时是准确的,所以我们定义了如何处理错误。在这种情况下,出于演示目的,我将忽略任何预期的异常。
@SubscribeEvent
public void autoChargeCreeper(LivingSpawnEvent event)
{
if(!(event.getEntity() instanceof CreeperEntity))
return;
CreeperEntity creeper = (CreeperEntity) event.getEntity();
if(creeper.isCharged())
return;
try
{
Field field;
field = creeper.getClass().getDeclaredField("POWERED");
field.setAccessible(true);
DataParameter<Boolean> powered = (DataParameter<Boolean>) field.get(creeper);
creeper.getDataManager().set(powered, true);
} catch (NoSuchFieldException | IllegalAccessException ignored) { }
}https://stackoverflow.com/questions/63852531
复制相似问题