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() 刻意返回空字符串。