新兵皮肤

新兵皮肤

Recruits的客户端附加组件,适用于Forge 1.20.1。将普通的Minecraft玩家皮肤放入文件夹,你的Recruits就会穿上;无需资源包,无需服务器支持,不进行任何上传或下载。

新兵皮肤(Recruits Skins)

你的军队,穿上了真实玩家的皮肤。 将普通的 Minecraft 皮肤 PNG 文件放入一个文件夹,每个新兵都会穿上其中一件——包括新兵、弓箭手、弩手、盾卫、游牧民、骑兵、斥候、信使、队长、巡逻队长、攻城工程师和贵族。无需资源包、无需服务器安装、无需反复重启。每个单位选择的皮肤看似随机但永不改变,所以坚守你东门的那个伤痕累累的老兵,明天、下周甚至在你重装整合包之后,依然是那个坚守东门的老兵。

Minecraft 1.20.1 · Forge 47.x · Java 17 仅客户端。免费开源,使用 GPL-3.0-only 许可证。 需要 Recruits 1.15.2 版本。


它的实际作用

  • 读取文件夹,而非资源包。 皮肤文件存放在 config/recruits_skins/ 文件夹中。首次启动时会自动创建该文件夹,并附带一个 _README.txt 文件。放入 PNG 文件,按 F3+T,完成。支持子文件夹,完全由你自行组织——按阵营、按作者或按任何你喜欢的方式分类。
  • 你的皮肤,而非固定列表。 Recruits 自带二十种人类皮肤并分配到你的军队中。本模组会用你的皮肤替换该池:收录尽可能多的面孔,由任何人绘制,随时更换。
  • Recruits 无法绘制的外层皮肤层。 Recruits 在简单的人形模型上构建人类单位,因此玩家皮肤的外套、袖子和裤子的覆盖层会被静默丢弃——而这通常是大多数皮肤实际穿着的一半。本模组会渲染这些层,并将其与身体进行姿态匹配,让皮肤的效果与玩家穿戴时一致。
  • 同一单位始终拥有相同的面孔。 分配是基于单位的 UUID 计算而非记录,因此能经受住区块卸载、世界重载、游戏重启和模组重装——且无需担心数据库文件损坏或迁移。雇佣新兵后,它会立即拥有自己的面孔。
  • 新增皮肤不会导致军队“换脸”。 这是大多数实现在此犯下的错误。新增第九个皮肤时,只有该皮肤真正对应的单位会改变;其他单位保持你已知的面孔。删除一个皮肤时,只有穿戴该皮肤的单位会发生变动。原地重绘一个 PNG(不重命名)只会改变该皮肤的外观,而不会让任何单位变动。
  • 同时支持纤细和经典手臂。 文件名中的 _slim 或 _classic 后缀,或 slim/ 或 classic/ 子文件夹,均可直接指定。否则,模组会检查手臂像素——纤细皮肤会让更宽手臂所需覆盖的纹素保持透明——并自动识别。纤细单位会获得正确的三像素手臂模型,而 Recruits 自己的队伍和伙伴布料也会正确落在这更窄的几何体上。
  • 无需重启即可重载。 F3+T 会与资源包一起重载文件夹。/recruitsskins reload 也可按需执行。扫描和解码在渲染线程之外进行,因此包含数百个皮肤的文件夹也不会导致游戏卡顿。
  • 它会告诉你为什么没有生效。 /recruitsskins status 命令会报告附加组件是否启用、十二种单位类型中有多少种实际使用了 Recruits 的人类渲染器、文件夹路径、按手臂类型划分的皮肤加载数量,以及每个被拒绝的文件及其原因——比如“预期 64x64,实际得到 128x128”,而不是静默忽略。
  • 坏文件一次只影响一个。 一个损坏的 PNG 只会让你损失该 PNG。尺寸错误的图像、旧版 64×32 皮肤、空文件,以及某人改名为 .png 的文本文件,都会被点名并跳过,而其他相邻文件正常加载。空文件夹也不是错误——单位会完全按照 Recruits 的原始绘制方式显示。
  • 阵营颜色得以保留。 Recruits 会在其单位上绘制队伍颜色、区域服装和伙伴布料。每项都被区别且有针对性的处理,而非一概禁用:默认情况下,队伍颜色保留,伙伴布料保留,只有全身性的区域制服会被移除。详见下文。

护甲会像平常一样渲染在皮肤之上。弓箭、弩、盾牌、火枪、自定义头、潜行、骑乘以及所有上游动画均不受影响——本模组仅更改一个纹理和一个模型,其余部分交由 Recruits 处理。


为什么要用

Recruits 为你提供了一支由个体组成的军队,他们会战斗、跟随、驻守并晋升,但所有个体都穿着同一套二十种纹理的“制服”。当军队规模超过一定程度,你看到的便不再是士兵,而是复制品。

本模组将这套“制服”转变为你拖入文件的文件夹。由于分配是稳定且影响极小的,管理这个文件夹实际上令人愉悦——你可以在战役中途添加皮肤,而不会让整个驻军“换脸”,这使其值得长期精心打造一支队伍,而非设定一次便再也不动。

对于整合包作者:将相同的 config/recruits_skins 内容和相同的 selectionSeed 分发到每个客户端,所有人都将在相同位置看到相同的士兵,而无需在网络上传输一个字节。


截图

占位符——发布前请添加截图:

  • 一个由五六个外观明显不同的新兵组成的小队站在一起。
  • 一个纤细手臂单位与一个经典手臂单位并排,手臂特写。
  • 一个全副武装的单位,展示护甲如何渲染在自定义皮肤之上。
  • 两个不同队伍颜色的单位,展示阵营颜色如何保留在自定义皮肤之上。
  • 聊天气泡中 /recruitsskins status 的输出,包括一个被拒绝的文件。

仅使用你拥有或有权展示的皮肤。


前置要求

  • Minecraft 1.20.1 搭配 Forge 47.x(基于 47.4.22 构建与测试)。
  • Recruits 1.15.2 版本——必需,仅客户端,且固定在该确切版本。
  • 开启 Recruits 的人类模型(见安装说明)。

Recruits 被声明为强制的客户端依赖项,因此没有它的客户端会在加载时以清晰的消息拒绝启动,而非稍后崩溃。

版本固定是精确且有意的。 本附加组件直接挂接 Recruits 的渲染器和服装层,因此仅针对一个特定构建进行测试,而非寄希望于一个宽泛的版本范围。在任何其他 Recruits 版本上,它都会拒绝加载——这是最诚实的结果,因为另一种选择是一个能加载却静默无效的模组。当 Recruits 更新时,本模组需要对应的匹配版本。


安装

  1. 为 1.20.1 安装 Forge。

  2. 将两个 jar 文件放入你的 mods/ 文件夹:

    • recruits-1.20.1-1.15.2.jar
    • recruitsskins-0.1.0.jar(本模组)
  3. 启动一次。 这将会创建 config/recruits_skins/ 和 config/recruitsskins-client.toml。

  4. 开启 Recruits 的人类模型。 打开 config/recruits-client.toml 并设置:

    RecruitsLookLikeVillagers = false
    

    然后重启游戏。 Recruits 在启动时选择其渲染器——在游戏进行中更改此设置不会生效,直到下次启动。这一步几乎难倒了所有人,因此 /recruitsskins status 会明确报告实时状态,并在文件与运行中的游戏不一致时发出警告。

  5. 将 64×64 的玩家皮肤 PNG 文件放入 config/recruits_skins/。

  6. 按 F3+T 或运行 /recruitsskins reload。

仅在客户端安装。专用服务器不需要它,也不会从中受益,如果意外安装到服务器上,它会加载却不做任何事。


什么算作皮肤

项目 要求
格式 PNG,精确 64×64——现代皮肤尺寸
手臂布局 经典(4px)和纤细 / Alex(3px),均支持
覆盖层 帽子、外套、袖子和裤子均会渲染
旧版 64×32 拒绝——请先转换为 64×64
其他任何格式 拒绝,并在 /recruitsskins status 中点名

任何来自任意皮肤网站的皮肤均可用,只要是现代 64×64 布局即可。你自己的 Minecraft 皮肤也可以。你自己绘制的皮肤也一样。

告诉模组关于纤细皮肤的信息

PNG 内部没有任何信息记录其绘制时使用的手臂宽度,因此模组会检查手臂像素并自动识别。这对大多数皮肤是正确的,但对少数皮肤会判断错误——一个导出时那些未使用的纹素被填色的纤细皮肤会被识别为经典。

如果手臂看起来差一个像素,可以通过文件名或文件夹来指定:

config/recruits_skins/
├── royal_soldier_slim.png      强制为纤细
├── city_archer_classic.png     强制为经典
├── slim/
│   └── frontier_scout.png      此文件夹中的所有内容均为纤细
└── regional/
    └── desert_ranger.png       从像素中自动识别

_slim、-slim 和 .slim 均有效,classic 的对应写法亦然,文件名标记优先于文件夹标记。或者,将配置中的 armModelDetection 设置为 classic 或 slim,可完全跳过自动猜测。

重命名文件会改变穿戴它的单位。原地重绘则不会。


Recruits 自带的服装

Recruits 会在其单位上绘制三种不同的东西,而自定义皮肤需要与它们共处。它们是独立处理的,因为保留它们的价值并不相同。

层 默认 原因
队伍颜色 保留 在战斗中,它可以让你一眼看出单位属于哪一方。
通用服装 移除 无关联单位穿着的普通布料——正是你的皮肤要替换的东西。
区域服装 移除 全身纹理。它会完全盖住你选择的皮肤。
伙伴布料 保留 标记信使、斥候、队长和攻城工程师,玩家可据此辨认他们。

前两者是同一个上游层扮演的两种角色,这就是为什么 teamOverlayMode 有三种设置而非一个开关:TEAM_ONLY(默认)保留颜色并移除服装,UPSTREAM 两者都保留,OFF 两者都移除。

以上设置均不会影响没有自定义皮肤的单位。 空文件夹、禁用附加组件,或 Corpse(尸体)身体上的单位,都会完全按照 Recruits 的原始绘制方式渲染,无论这些设置如何。

一个诚实的注意事项:皮肤的外套、袖子和裤子位于身体外侧约一像素的位置,因此这些位置的不透明像素可能会覆盖下方的队伍或伙伴布料。这是普通的玩家模型行为,不是缺陷——穿外套的玩家也是这样。如果你更看重无遮挡的制服而非皮肤保真度,可将 renderPlayerOuterLayers 设为 false;帽子属于基础模型部分,不受影响。


命令

所有命令均为客户端侧,因此可在任何服务器上使用——包括那些从未听说过本模组的服务器。

命令 作用
/recruitsskins 等同于 status
/recruitsskins reload 重新扫描文件夹并报告加载情况
/recruitsskins status 启用状态、有多少种单位类型实际使用人类渲染器、文件夹路径、各手臂类型数量、种子、所有三种服装策略,以及每个被拒绝的文件及其原因
/recruitsskins list [page] 列出每个已加载的皮肤及其手臂模型
/recruitsskins folder 皮肤读取的绝对路径

/rskins 是所有这些命令的别名。F3+T 也会重载文件夹。服务器的 /reload 不会——它与你机器上的文件无关。


配置

config/recruitsskins-client.toml:

[general]
	enabled = true
	selectionSeed = 0
	renderPlayerOuterLayers = true

[models]
	armModelDetection = "auto"

[recruitsLayers]
	teamOverlayMode = "TEAM_ONLY"
	applyBiomeOverlay = false
	applyCompanionOverlay = true

[loading]
	recursive = true
	maxScanDepth = 8
	maxSkinCount = 512
	maxFileSizeKiB = 1024
	showReloadSummary = true

[cache]
	maxRecruitAssignments = 8192

值得了解的设置:

  • selectionSeed — 更改它会立即重掷世界中所有单位的外观。想要所有玩家看到完全相同士兵的整合包必须分发相同的种子。
  • teamOverlayMode — TEAM_ONLY、UPSTREAM 或 OFF。参见上一节。
  • applyBiomeOverlay — 设为 true 可在你的皮肤之上重新应用 Recruits 的区域服装。
  • renderPlayerOuterLayers — 设为 false 可移除外套、袖子和裤子,让上游布料无遮挡地显示。
  • armModelDetection — auto、classic 或 slim,用于没有文件名标记的皮肤。

其余均为边界和日志设置。除扫描边界外,所有设置更改后立即生效,扫描边界变更会触发重新扫描。


多人游戏

你的皮肤仅属于你。服务器永远不会被告知它们,也不需要该模组。

情况 结果
你有模组,服务器没有 正常工作。这是常规情况。
其他玩家没有模组 他们看到普通的 Recruits。一切正常。
两个玩家使用不同的文件夹 他们看到不同的士兵。这是预期行为,不是缺陷。
两个玩家使用相同的文件夹和相同的 selectionSeed 他们看到完全相同的士兵。
意外安装到专用服务器上 它会加载,不做任何事,也不会妨碍任何人。

本模组从不根据用户名、UUID 或 URL 上传、下载或获取皮肤。它只读取你磁盘上的文件,无其他。它不添加任何数据包、实体数据,也不会向你的存档写入任何内容。


出现问题时

首先运行 /recruitsskins status——它能解答大部分疑问。

  • “人类渲染器活跃:0 / 12” — 在 recruits-client.toml 中设置 RecruitsLookLikeVillagers = false 并重启。这是最常见的原因。
  • “已加载:0 个皮肤” — 查看下方的拒绝列表。图像尺寸错误通常是原因。
  • 皮肤已加载但单位外观无变化 — 模型设置更改后未重启。状态行会明确说明这一点。
  • 手臂看起来差一个像素 — 纤细/经典的自动判断出错了。请用 _slim 或 _classic 后缀重命名文件。
  • 晋升后的单位改变了面孔 — 这是预期行为;见下文。

如果没有可用的皮肤,单位会完全按照 Recruits 的原始绘制方式渲染。这是设计上的回退方案,而非故障。


兼容性

基于窄范围的 Mixin 注入构建,无覆盖重写,因此它继承而非复刻 Recruits 的模型、姿态、动画、护甲、装备和持械姿势逻辑。它不替换实体渲染器,因此应能与其他渲染模组共存。如果另一个模组也改变了新兵的基础纹理,取胜者取决于注入顺序——请反馈,我们将记录在案。

Corpse(尸体) 得到支持并有针对性处理:尸体保留 Recruits 自身的纹理,而非自定义皮肤。Recruits 用一个承载死亡单位变体、生物群系和队伍但不含其身份信息的替代品来绘制尸体,因此原始的皮肤确实无法恢复。尸体穿着陌生人的面孔会被视为缺陷,因此它选择回退。如果未安装 Corpse,模组的该部分将完全自行关闭。


本版本未包含

  • 晋升后保留面孔。 Recruits 通过创建新实体并废弃旧实体来实现晋升,新实体会获得新的身份。选择会跟随该身份,因此就本模组而言,晋升后的单位是一个新人。正确修复意味着要在你的存档中存储外观数据,这比听起来要复杂得多。
  • 根据用户名、UUID 或 URL 获取皮肤。仅本地文件,这是刻意设计。
  • 服务器强制执行或同步的皮肤分配。
  • Recruits 使用村民模型时的皮肤。玩家皮肤在几何上不适用于该模型。
  • 披风、鞘翅纹理、动画 PNG 或高清皮肤布局。
  • 按单位类型、生物群系、队伍或武器路由皮肤池。子文件夹仅用于整理——目前如此。
  • 手动将特定皮肤固定到特定单位。

皮肤权利

你自己文件夹中的皮肤是你自己的事。如果你在整合包中附带皮肤美术资源,请确保你拥有分发该美术资源的许可。 玩家皮肤是由人创作的,其中很多并不允许自由再分发。


许可证与鸣谢

GPL-3.0-only。源代码位于 github.com/otectus/RecruitsSkins。

Recruits 由 talhanation 开发,是独立项目,保留所有权利。本模组未复制 Recruits 的任何代码或资源,也未随附分发其 jar 文件。