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 层校验才认可:
te.signText[0].startsWith(Sign.IDENTIFIER)SignClassTransformer.getMyEssentialsDataValue(te)取根标签,且其Type等于"MyTown:SellSign"- 根标签的
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(首字母大写)。
相关条目
- Mod 入口 -
postInit中注册 - Plot -
plot字段来源 - EconomyProxy - 交易结算
- MyEssentials-Core -
Sign/SignType/SignClassTransformer(已收录)