SellSign

基本信息

属性 值
类名 mytown.entities.signs.SellSign
文件 src/main/java/mytown/entities/signs/SellSign.java
继承 extends myessentials.entities.api.sign.Sign
启用版本 Minecraft 1.7.10

功能

出售告示牌 —— 本 mod 唯一注册到游戏的内容类型(见下方「注册」)。 玩家在自家地块放置告示牌标价出售,右键即可完成交易。

字段

字段 类型 说明
price int 标价
restricted boolean 是否仅限本镇居民购买
owner Resident 所有者
plot Plot 所在地块(构造时按坐标反查)

两个构造器:

  • SellSign(BlockPos bp, int face, Resident owner, int price, boolean restricted) —— 新建,经 createSignBlock(...) 放置方块,并把 Owner / Price / Restricted 三项写进 NBT(Owner 存 UUID 字符串)。
  • SellSign(TileEntitySign te, NBTTagCompound signData) —— 从已有告示牌恢复,位置取自 te.getWorldObj().provider.dimensionId。

onRightClick(EntityPlayer):若 restricted 为真且点击者不在该镇 residentsMap 中,则拒绝交易。

⚠️ 注册(本 mod 唯一)

SellSignType extends SignType,在 Mod 入口 的 postInit 阶段注册:

SellSign.SellSignType.instance.register();
方法 返回
getTypeID() "MyTown:SellSign"
loadData(TileEntitySign, NBTBase) 由 NBT 还原 SellSign
isTileValid(TileEntitySign) 校验告示牌是否属于本类型

除它之外,全 mod 不注册任何 Block / Item / Entity / TileEntity。

实现要点

⚠️ 告示牌 ID 是 MyTown:SellSign,而 modid 是 MyTown2 —— 两者字符串不同,容易误认为资源域是 MyTown2。

⚠️ isTileValid 需通过 3 层校验才认可:

  1. te.signText[0].startsWith(Sign.IDENTIFIER)
  2. SignClassTransformer.getMyEssentialsDataValue(te) 取根标签,且其 Type 等于 "MyTown:SellSign"
  3. 根标签的 Value 必须是 NBTTagCompound

任何异常都被 catch (Exception ex) { return false; } 吞掉并返回 false —— 即校验失败是静默的,不抛异常。

⚠️ Sign.IDENTIFIER 定义在 MyEssentials-Core: public static final String IDENTIFIER = EnumChatFormatting.DARK_BLUE.toString(); 即 §1(深蓝颜色码)。告示牌首行必须以 §1 开头才被识别, 这是玩家手动伪造告示牌的关键门槛。

  • getOrMakeResident(UUID) 表示居民不存在时会即时创建,不是要求预先存在。
  • 持久化字段名固定为 Owner / Price / Restricted(首字母大写)。

相关条目