CosmeticArmorReworked
[!INFO] Git Commit:
6063fde| Updated: 2026-09-08
CosmeticArmorReworked 是 GTNH(1.7.10 / Forge 10.13.4.1614)的一个纯客户端视觉 mod,作者 zlainsama,原始作者 dmillerw(原始版本见 Baubles 系代码,作者说明部分逻辑参考 azanor/baubles,按钮图标由 izuminya 提供)。
它让玩家同时拥有两套护甲:一套是原版护甲格(有实际防御作用),另一套是本 mod 提供的「时装护甲」,只参与渲染。额外每槽还有一个「皮肤模式」开关,可以把某个部位的时装护甲临时隐藏以露出皮肤。界面上还带一个全局开关,可在 PVP 场景下把整个 mod 的渲染效果在本地关掉。
modid cosmeticarmorreworked,根包 lain.mods.cos,Minecraft 1.7.10,useMetadata = true。源码共 21 个 Java 文件 + 1 张 GUI 贴图 + 2 个语言文件。
源码结构(两个根包)
| 路径 | 内容 |
|---|---|
lain/mods/cos/CosmeticArmorReworked.java |
@Mod 主类,注册 4 个封包判别字与 GuiHandler |
lain/mods/cos/InventoryManager.java |
服务端代理:LoadingCache<UUID, InventoryCosArmor>、读盘/写盘、死亡掉落、tick 广播 |
lain/mods/cos/GuiHandler.java |
IGuiHandler,仅 GUI ID 1 |
lain/mods/cos/inventory/ |
InventoryCosArmor(4 槽 IInventory)、ContainerCosArmor(49 槽 Container) |
lain/mods/cos/network/ |
NetworkManager(通道 lain|nm|cos)、NetworkPacket、NetworkPacketCodec、NetworkPacketHandler |
lain/mods/cos/network/packet/ |
4 个封包实现 |
lain/mods/cos/client/ |
InventoryManagerClient、PlayerRenderHandler、GuiEvents、GuiCosArmorInventory、GuiCosArmorButton、GuiCosArmorToggleButton、KeyHandler |
net/minecraft/client/gui/GuiScreenTooltipHelper.java |
不是 Mixin / coremod,而是放进原版包的普通静态工具类 |
关于 net.minecraft.client.gui.GuiScreenTooltipHelper:它被 GuiEvents 用来访问 GuiScreen 的 protected 成员(buttonList 字段与 func_146283_a 即 drawHoveringText)。Java 中 protected 成员在同包内可直接访问,所以只要把工具类放进 net.minecraft.client.gui 包即可,无需 Mixin、无需 Access Transformer、无需 coremod 转换——而 gradle.properties 中 usesMixins、accessTransformersFile、coreModClass 全部为空,也印证了这一点。该类为 final + 私有构造函数,两个方法都是纯转发。
游戏设定
- 时装护甲物品栏 — 4 槽
IInventory,与原版armorInventory下标对齐,49 槽容器,槽位合法性校验 - 皮肤模式开关 — 每槽独立
boolean,隐藏该部位时装以露出皮肤 - 客户端护甲渲染替换 —
RenderPlayerEvent/RenderHandEvent上的「换入 → 渲染 → 换回」,纯客户端 - 界面与按钮 — GUI ID 1 与按钮 ID 76 / 77 / 80~83,以及
GuiScreenTooltipHelper的作用 - 网络封包 — 通道
lain|nm|cos的 4 个封包(判别字 1~4)对比 - 时装护甲数据文件 —
playerdata/<UUID>.cosarmor的 NBT 结构与keepInventory死亡掉落
热键
- 打开时装物品栏热键 —
cos.key.openCosArmorInventory,默认Keyboard.KEY_NONE(未绑定),分类key.categories.inventory
网络封包总览
| 封包类 | 判别字 | 方向 | 载荷 | 何时发送 |
|---|---|---|---|---|
PacketSyncCosArmor |
1 | 服务端 → 客户端 | UUID + slot + isSkinArmor + ItemStack | 玩家登录广播;PlayerTickEvent 检出 isDirty() 时广播 |
PacketSetSkinArmor |
2 | 客户端 → 服务端 | slot + isSkinArmor | 点击皮肤模式按钮 80~83 |
PacketOpenCosArmorInventory |
3 | 客户端 → 服务端 | 无 | 按下热键;在原版背包点击按钮 76 |
PacketOpenNormalInventory |
4 | 客户端 → 服务端 | 无 | 在成品界面点击按钮 76 |
逐包细节见 网络封包。
本 mod 不包含的内容
以下内容经 grep 确认在本 mod 的 21 个 Java 文件中完全不存在,因此 wiki 中没有对应目录:
| 维度 | 证据 |
|---|---|
| 方块 / TileEntity | grep -rn "registerBlock|registerTileEntity|class .* extends Block|TileEntity" 无匹配 |
| 物品 | 无 registerItem,无 class .* extends Item,无 addRecipe / registerRecipe;mcmod.info 中 "requiredMods": [] |
| 实体 | 无 registerEntity,无 Entity 子类 |
| 多方块结构 | 无 Multiblock / IMultiblock / structure 相关实现 |
| 附魔 | 无 Enchantment 子类,无附魔注册 |
| 维度 | 无 registerDimension / WorldProvider / DimensionManager |
| Buff / Debuff | 无 PotionEffect / addPotionEffect(InventoryEffectRenderer 仅为药水附魔的渲染光效,非状态效果) |
| 群系 | 无 BiomeGen / 群系注册 |
| 世界生成结构 | 无 IWorldGenerator |
| 成就 | 无 Achievement 注册(界面按钮 0/1 调用的是原版 GuiAchievements / GuiStats) |
| 物品效果 | 无来源物品,故不存在「来源物品 → 触发条件」型效果 |
| 指令 | 无 ICommand / CommandHandler / addChatCommand;@Mod.EventHandler 只有 3 个(init、onServerStarting、onServerStopping) |
| 配置文件 | 无 @Configuration / Configuration 引用,无 .cfg 资源 |
| 权限等级 | 全部 4 个封包无权限检查,canInteractWith() 与 isUseableByPlayer() 恒返回 true |
| 第三方 mod 集成 | 无 nei/、jei/、IModPlugin、WAILA 等任何外部 mod API 引用 |
| Mixin / coremod / AT | gradle.properties 中 usesMixins、mixinsPackage、coreModClass、accessTransformersFile 全部为空 |
补充:语言文件只有 3 个键(cos.key.openCosArmorInventory、cos.gui.buttonCos、cos.gui.buttonNormal),因为本 mod 不注册任何可本地化的方块/物品/容器名——InventoryCosArmor.getInventoryName() 刻意返回空字符串。