Skip to content

添加女仆饰品

tartaric_acid edited this page Jun 6, 2025 · 2 revisions

女仆饰品是女仆物品栏中的特殊槽位,放入的物品通常能为女仆带来特殊能力。例如,各类伤害保护饰品,或可以大范围吸取掉落物的饰品。

本例中,为了演示方便,我们将原版木棍设计成一个女仆饰品:当木棍被放入女仆饰品栏时,将为女仆赋予原版的“发光”效果。此外,若女仆佩戴木棍饰品并受到火焰伤害时,将再次赋予发光效果并损坏饰品。

一、新建 IMaidBauble 子类

首先,创建一个继承自 IMaidBauble 的子类 CustomBauble

public class CustomBauble implements IMaidBauble {    
}

仔细观察 IMaidBauble 类,你会发现其中有一个 onTick 方法。该方法会在女仆佩戴饰品后每 tick 执行一次。还有一个 getChatBubbleId 方法,目前暂不需要重写。

为了避免频繁检测带来的性能损耗,我们可以每隔一段时间为女仆添加发光效果。例如:

public class CustomBauble implements IMaidBauble {
    /**
     * 每 tick 调用的方法,为女仆定期添加发光效果。
     *
     * @param maid       女仆实体
     * @param baubleItem 饰品物品实例
     */
    @Override
    public void onTick(EntityMaid maid, ItemStack baubleItem) {
        // 每 150 tick 检查一次,减少性能消耗
        if (maid.tickCount % 150 == 0) {
            maid.addEffect(new MobEffectInstance(MobEffects.GLOWING, 200));
        }
    }
}

此外,我们还希望女仆在佩戴饰品且受到火焰伤害时获得发光效果并损坏饰品。这可以通过事件系统实现。

和前述方法类似,事件注册不要使用 @Mod.SubscribeEvent 注解,而应在构造方法内手动注册,这样只有在女仆模组加载后事件才会生效。

public class CustomBauble implements IMaidBauble {
    // 构造方法,注册事件监听器到 MinecraftForge 事件总线。
    public CustomBauble() {
        MinecraftForge.EVENT_BUS.register(this);
    }
    
    @SubscribeEvent(priority = EventPriority.HIGH)
    public void onMaidDamage(MaidDamageEvent event) {
        EntityMaid maid = event.getMaid();
        DamageSource source = event.getSource();
        // 仅检测火焰伤害类型
        if (!source.is(DamageTypeTags.IS_FIRE)) {
            return;
        }
        // ItemsUtil 是工具类,用于检索女仆身上的饰品
        // getBaubleSlotInMaid 会返回佩戴的第一个对应饰品槽位
        int slot = ItemsUtil.getBaubleSlotInMaid(maid, this);
        if (slot >= 0) {
            maid.addEffect(new MobEffectInstance(MobEffects.GLOWING, 200));
            // 获取女仆当前佩戴的饰品
            ItemStack stack = maid.getMaidBauble().getStackInSlot(slot);
            // 损坏饰品(木棍本身无耐久,hurtAndBreak 不起作用)
            stack.hurtAndBreak(1, maid, m -> maid.sendItemBreakMessage(stack));
            event.setCanceled(true);
        }
    }
}

说明:由于木棍本身没有耐久度,因此上述 hurtAndBreak 方法不会实际损坏物品。

上述代码中的 ItemsUtil 是一个工具类,可方便地检索女仆身上的物品、饰品等。

二、将饰品与物品绑定

接下来,需要将自定义饰品与物品绑定。回到 LittleMaidCompat 类,重写 bindMaidBauble 方法,将木棍与自定义饰品进行绑定:

@LittleMaidExtension
public class LittleMaidCompat implements ILittleMaid {
    // 绑定女仆饰品,将自定义饰品与物品关联
    @Override
    public void bindMaidBauble(BaubleManager manager) {
        // 将木棍与自定义饰品绑定
        manager.bind(Items.STICK, new CustomBauble());
    }
}

此时,进入游戏,鼠标悬浮于木棍之上即可看到相关提示:1.png

将木棍放入女仆饰品栏,即可体验相应效果!

Clone this wiki locally