首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的世界锻造-我如何获得一个实体并改变它的状态?

我的世界锻造-我如何获得一个实体并改变它的状态?
EN

Stack Overflow用户
提问于 2020-09-12 02:34:18
回答 1查看 2.1K关注 0票数 0

我从锻造模型开始,我想让所有的爬行动物都像带电的爬行动物一样产卵。我使用的是forge MDK 1.16.3。

下面是我的事件处理程序:

代码语言:javascript
复制
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;
        
        
    }
}

但我不知道这之后该做什么。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-12 08:40:45

LivingSpawnEvent将在每次实体生成到一个世界时触发,这包括你离开和返回的时间,所以请记住这一点。

由于每个生成实体都会触发该事件,因此我们希望检查该实体是否是爬行器,因此我们检查它是否是CreeperEntity类的实例,如果不是,则返回。

代码语言:javascript
复制
if(!(event.getEntity() instanceof CreeperEntity))
    return;

现在我们知道我们有了一个爬行器,我们可以安全地对它进行强制转换以获得爬行器实体。然后,我们检查爬行器是否已经充电,如果已经充电,则返回;因为不需要继续。

代码语言:javascript
复制
CreeperEntity creeper = (CreeperEntity) event.getEntity();
if(creeper.isCharged())
    return;

通常,爬行器通过闪电充电,我们可以模拟此功能使爬行器充电:

代码语言:javascript
复制
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。

代码语言:javascript
复制
Field field;
field = creeper.getClass().getDeclaredField("POWERED");
field.setAccessible(true);

然后,我们可以将该值设置为true,这会将爬行器设置为带电。

代码语言:javascript
复制
DataParameter<Boolean> powered = (DataParameter<Boolean>) field.get(creeper);
creeper.getDataManager().set(powered, true);

最后,我们应该把它包装在一个try/catch中,因为我们不能控制CreeperEntity的内容,所以我们不能保证我们对其内容的假设在执行时是准确的,所以我们定义了如何处理错误。在这种情况下,出于演示目的,我将忽略任何预期的异常。

代码语言:javascript
复制
@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) { }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63852531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档