如何解决minecraft 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;
}
}
但是我不知道之后该怎么办。预先感谢!
解决方法
每次将实体产生到世界中时,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
字段并将其设置为可访问。
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) { }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。