末影邮件

基本信息

属性 值
注册名 RandomThings:enderLetter
类 lumien.randomthings.Items.ItemEnderLetter
堆叠上限 1(ItemEnderLetter.java:23)
变体数 2(metadata 0 空 / 1 已寄)
GUI ID GuiIds.ENDER_LETTER = 8(GuiIds.java:13)
实现接口 IItemWithProperties(ItemEnderLetter.java:21)
开关 Items.EnderLetter(RTConfiguration.java:219)

功能

末影邮件是一个玩家间物品传递道具:填写收件人后可把物品寄给另一名在线玩家。

状态显示

hasEffect 在 metadata 为 1 时返回 true,使已寄出的邮件发出附魔光效(ItemEnderLetter.java:26-28):

return par1ItemStack.getItemDamage() == 1;

addInformation 读取 NBT 显示寄/收件人(:31 起),语言键见 zh_CN.lang:163-167:

键 中文 触发条件
text.enderLetter.noReceiver 尚未收件人 收件人为空
text.enderLetter.receiver 收件人: %s 已填收件人
text.enderLetter.sender 寄件人: %s 已有寄件人
text.enderLetter.invalidreceiver 你填写了一个无效的收件人 收件人无效
text.enderLetter.empty 你不能寄出空的邮件 内容为空

NBT 键为 RandomThingsNBTKeys.RECEIVER 与 SENDER(ItemEnderLetter.java:33-34)。

GUI 结构

ContainerEnderLetter 继承 ContainerItem,包含 9 个物品槽与 9 个只读输出槽(Container/ContainerEnderLetter.java:22-24):

for (int col = 0; col < 9; ++col) {
    addSlotToContainer(new Slot(letterInventory, col, 8 + col * 18, 18));
    addSlotToContainer(new SlotOutputOnly(letterInventory, col, 8 + col * 18, 18));
}

即 3×3 网格上排可放入、下排为回执(SlotOutputOnly 只读)。后接玩家 27 + 9 格。

数据持久化

与磁力仪共用世界存档根目录的 RandomThings.dat。LetterHandler 在服务器启动时 readFromNBT()(RandomThings.java:168-169)。读取失败时提示 text.error.nbt,说明"末影邮件及磁力仪等物品将在游戏重启后消失"(zh_CN.lang:156)—— 可见本物品的数据完全依赖该 NBT 文件。

数值

数值名 值
堆叠上限 1
物品槽位 9(3×3)
回执槽位 9(SlotOutputOnly)
状态 metadata 0 = 未寄出,1 = 已寄出
GUI ID 8

交互

触发 行为
右键 打开 GUI ID 8
放入物品 + 填收件人 寄出,metadata 置 1,发光效
收到邮件 物品出现在输出槽
收件人无效 提示「你填写了一个无效的收件人」
内容为空 提示「你不能寄出空的邮件」

合成配方

fpl
字符 物品
f 末影碎片(RandomThings:ingredient meta 2)
p 纸(Items.paper)
l 皮革(Items.leather)

来源:Library/Recipes.java:350-359,受 ConfigItems.enderLetter 约束。

[!NOTE] PacketHandler.init() 中本物品的封包注册被注释掉了(Network/PacketHandler.java:22-23):

// INSTANCE.registerMessage(MessageEnderLetter.class,
// MessageEnderLetter.class, 0, Side.SERVER);

而 MessageEnderLetter 类在本仓库中根本不存在(Network/Messages/ 下共 13 个文件,无此文件)。因此本物品没有专用网络封包,物品转移走的是 RandomThings.dat NBT 文件而非封包。

相关条目