
新兵皮肤
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.20.1 安装 Forge。
将两个 jar 文件放入你的
mods/文件夹:recruits-1.20.1-1.15.2.jarrecruitsskins-0.1.0.jar(本模组)
启动一次。 这将会创建
config/recruits_skins/和config/recruitsskins-client.toml。开启 Recruits 的人类模型。 打开
config/recruits-client.toml并设置:RecruitsLookLikeVillagers = false然后重启游戏。 Recruits 在启动时选择其渲染器——在游戏进行中更改此设置不会生效,直到下次启动。这一步几乎难倒了所有人,因此
/recruitsskins status会明确报告实时状态,并在文件与运行中的游戏不一致时发出警告。将 64×64 的玩家皮肤 PNG 文件放入
config/recruits_skins/。按 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 文件。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。