
守卫村民皮肤
将普通的Minecraft玩家皮肤放入config/guard_skins文件夹,世界中的每个守卫都会随机佩戴一个——外观随机,但同一名守卫在区块重载和服务器重启后保持相同面容。
守卫村民皮肤(Guard Villager Skins)
你的守卫,穿上真实的玩家皮肤。 将普通的 Minecraft 皮肤 PNG 文件放入一个文件夹,每个守卫村民(Guard Villagers)的守卫都会穿上一件。无需资源包,无需服务器安装,无需重启循环。每个守卫会挑选一个看似随机但永不改变的皮肤——北门那位伤痕累累的老兵,明天、下周,甚至在你重新安装整合包之后,依然还是那位伤痕累累的老兵。
尽管这个模组目前能做的可能仅比使用资源包能做到的稍多一些,但我完全打算在不久的将来进一步扩展它。
Minecraft 1.20.1 · Forge 47.x · Java 17 仅客户端。免费开源,采用 GPL-3.0-only 许可。 需要 Guard Villagers。
它实际做了什么
- 读取文件夹,而非资源包。 皮肤存放在
config/guard_skins/中。首次启动时会自动创建该文件夹,并附带一个_README.txt文件。放入 PNG 文件,按 F3+T,完成。支持子文件夹,纯粹为了你自己的整理——按地区、按作者、随你喜欢。 - 每个守卫都是不同的人。 文件夹中有八张皮肤,一个二十人的村庄就是二十个守卫拥有八种面孔,而不是二十个共享同一种纹理的复制品。这才是重点:资源包只能给守卫村民提供一种共享皮肤。
- 同一个守卫保持同一张脸。 分配是根据守卫的 UUID 计算而非记忆存储的,因此它能经受住区块卸载、世界重载、游戏重启和重新安装——没有数据库文件需要损坏或迁移。将村民转化为守卫,它会立即获得面孔;用刷怪蛋召唤一个,也是如此。
- 添加皮肤不会重新洗牌整个村庄。 这是大多数实现搞错的地方。放入第九张皮肤,只有那些实际选中该皮肤的守卫会改变;其他人都保持你已熟悉的面孔。删除一张皮肤,只有穿着它的守卫会更换。在不重命名的情况下原地重新绘制 PNG,它会改变该皮肤的外观,但不会让任何人更换。
- 纤细(Slim)和经典(Classic)手臂,两者皆支持。 文件名中的
_slim或_classic后缀,或slim/或classic/子文件夹,可直接确定。否则,模组会检查手臂像素——纤细皮肤会使更宽手臂会覆盖的纹素保持透明——并自行判断。纤细守卫会获得正确的三像素手臂模型,而非拉伸的经典模型。 - 无需重启即可重载。 F3+T 会与资源包一起重载该文件夹。
/guardskins reload同样可以按需重载。扫描和解码在渲染线程之外进行,因此包含数百张皮肤的文件夹不会导致游戏卡顿。 - 它会告诉你为什么什么都没发生。
/guardskins status会报告插件是否启用、Guard Villagers 是否确实正在使用其玩家模型、文件夹路径、按手臂类型分组的已加载皮肤数量,以及每个被拒绝的文件及其原因——例如“预期 64x64,实际找到 128x128”,而不是无声地无视。 - 坏文件一次只失败一个。 一个损坏的 PNG 只会让你损失那个 PNG。错误尺寸的图片、旧版 64×32 皮肤、空文件,以及被某人重命名为
.png的文本文件,都会被点名并跳过,而它们的邻居则正常加载。空文件夹也不是错误——守卫看起来就完全像 Guard Villagers 绘制的那样。 - 保持你选择的皮肤可见。 Guard Villagers 会在整个守卫身上绘制一套区域制服,这会完全覆盖自定义皮肤。当使用自定义皮肤时,该覆盖层会被跳过。使用原始纹理的守卫会保留它们的制服,而
applyBiomeVariantOverlay = true可以在你希望制服覆盖在皮肤之上时将其恢复。
盔甲会照常在皮肤之上渲染。帽子、夹克、袖子和裤子覆盖层都会随身体动画。弓、弩、盾牌、进食和守卫踢击动画均不受影响——该模组只更改一种纹理,对于纤细皮肤还更改一个模型,其余一切都交由 Guard Villagers 处理。
为什么值得折腾
Guard Villagers 自带一个“使用 Steve 模型”选项和一个单一的 guard_steve.png。如果你想让你的守卫看起来像其他任何样子,目前你的选择是:制作一个资源包,或者忍受世界上每个守卫都完全相同。
这个模组将其变成了一个你可以拖入文件的文件夹。由于分配是稳定且影响最小的,策划那个文件夹实际上很愉快——你可以在游戏中途添加皮肤,而不会让整个村庄换脸,这正是值得随时间建立皮肤库,而不是设置一次就再也不碰的原因。
对于整合包作者:向每个客户端附上相同的 config/guard_skins 内容和相同的 selectionSeed,每个人都会在相同的地方看到相同的守卫,而无需在网络上传送一个字节。
截图
占位符——发布前添加截图:
- 一个村庄大门,四五个明显不同的守卫站在一起。
- 一个纤细手臂守卫旁边站着一个经典手臂守卫,手臂特写。
- 一个全副武装的守卫,展示盔甲在自定义皮肤上的渲染效果。
- 聊天框中的
/guardskins status输出,包含一个被拒绝的文件。只使用你拥有或有权展示的皮肤。
前置要求
- Minecraft 1.20.1 搭配 Forge 47.x(已针对 47.4.22 构建并测试)。
- Guard Villagers
1.6.19——必需,客户端侧。 - 打开 Guard Villagers 的玩家模型选项(见安装)。
Guard Villagers 被声明为硬性的客户端依赖,因此没有它的客户端会以清晰的消息拒绝加载,而不是稍后崩溃。
安装
- 安装适用于 1.20.1 的 Forge。
- 将两个 jar 文件放入你的
mods/文件夹:guardvillagers-1.20.1-1.6.19.jarguardvillagerskins-0.1.0.jar(本模组)
- 启动一次。 这会创建
config/guard_skins/和config/guardvillagerskins-client.toml。 - 打开 Guard Villagers 的玩家模型选项。 打开
config/guardvillagers-client.toml并设置:
"Have guards use the steve model?" = true
然后重启游戏。 Guard Villagers 在启动时只选择一次模型——在游戏过程中更改此设置不会生效,直到下次启动。这几乎让所有人中招,所以 /guardskins status 会明确报告实时状态。
- 将 64×64 像素的玩家皮肤 PNG 文件放入
config/guard_skins/。 - 按 F3+T 或运行
/guardskins reload。
仅需在客户端安装。专用服务器不需要它,也不会从中受益,如果意外放到服务器上,它会加载但不做任何事情。
什么算作皮肤
| 格式 | PNG,严格 64×64——现代皮肤尺寸 |
| 手臂布局 | 经典(4px)和纤细 / Alex(3px),两者均支持 |
| 覆盖层 | 帽子、夹克、袖子和裤子全部渲染 |
| 旧版 64×32 | 拒绝——请先转换为 64×64 |
| 其他任何格式 | 拒绝并在 /guardskins status 中点名 |
任何皮肤网站的任何皮肤都可以,只要是现代 64×64 布局即可。你自己的 Minecraft 皮肤可以。你自己画的皮肤也可以。
告知模组皮肤为纤细型
PNG 内部没有任何信息记录它是为哪种手臂宽度绘制的,因此模组会查看手臂像素并自行判断。这对大多数皮肤是正确的,对少数则是错误的——一张纤细皮肤如果那些未使用的纹素被涂上了颜色,就会被识别为经典。
如果手臂看起来差了一个像素,请在文件名或文件夹中注明:
config/guard_skins/
├── royal_guard_slim.png 强制纤细
├── city_watch_classic.png 强制经典
├── slim/
│ └── forest_ranger.png 此文件夹中的所有内容均为纤细
└── regional/
└── desert_sentinel.png 根据像素自行判断
_slim、-slim 和 .slim 都有效,classic 的对应形式也是如此,文件名标记优先于文件夹标记。或者将配置中的 armModelDetection 设置为 classic 或 slim 以完全跳过猜测。
重命名文件会改变哪些守卫穿着它。原地重新绘制则不会。
命令
所有命令都是客户端侧的,因此它们在任何服务器上都能工作——包括从未听说过此模组的服务器。
| 命令 | 功能 |
|---|---|
/guardskins |
与 status 相同 |
/guardskins reload |
重新扫描文件夹并报告加载内容 |
/guardskins status |
启用状态、玩家模型是否实际激活、文件夹路径、按手臂类型统计的数量、种子、覆盖模式,以及每个被拒绝的文件及其原因 |
/guardskins list [page] |
每个已加载皮肤及其手臂模型 |
/guardskins folder |
读取皮肤的绝对路径 |
F3+T 也会重载该文件夹。服务器的 /reload 则不会——它与你机器上的文件无关。
配置
config/guardvillagerskins-client.toml:
[general]
enabled = true
applyBiomeVariantOverlay = false
selectionSeed = 0
[models]
armModelDetection = "auto"
[loading]
recursive = true
maxScanDepth = 8
maxSkinCount = 512
maxFileSizeKiB = 1024
showReloadSummary = true
[cache]
maxGuardAssignments = 8192
有三个设置值得了解:
selectionSeed— 更改它以同时重新随机分配世界中的每个守卫。希望每个玩家看到完全相同守卫的整合包必须附带相同的种子。applyBiomeVariantOverlay— 设置为true可将 Guard Villagers 的区域制服重新覆盖在你的皮肤之上。armModelDetection—auto、classic或slim,用于没有文件名标记的皮肤。
其余都是边界和日志设置。
多人游戏
你的皮肤仅属于你自己。服务器永远不会被告知它们,也不需要该模组。
| 你有该模组,服务器没有 | 有效。这是正常情况。 |
| 其他玩家没有该模组 | 他们看到普通的守卫。不会破坏任何东西。 |
| 两个玩家拥有不同的文件夹 | 他们看到不同的守卫。这是预期行为,而非错误。 |
两个玩家拥有相同的文件夹和相同的 selectionSeed |
他们看到完全相同的守卫。 |
| 意外安装在专用服务器上 | 它加载,什么都不做,不妨碍任何人。 |
该模组从不通过用户名、UUID 或 URL 上传、下载或获取皮肤。它只读取你磁盘上的文件,仅此而已。
当什么都没发生时
首先运行 /guardskins status——它能回答大部分问题。
- "Guard Villagers Steve model: no"(Guard Villagers Steve 模型:否) — 在
guardvillagers-client.toml中设置该选项并重启。这最容易导致问题。 - "Loaded: 0 skins"(已加载:0 个皮肤) — 查看下方的拒绝列表。通常都是图片尺寸错误。
- 皮肤已加载但守卫看起来没有变化 — 模型设置更改后未重启。
- 手臂看起来差一个像素 — 纤细猜测方向错误。用
_slim或_classic后缀重命名文件。
没有可用的皮肤时,守卫渲染完全如同 Guard Villagers 绘制的那样。这是预期的回退行为,而非故障。
兼容性
仅使用三个狭窄的 Mixin 注入构建,没有覆盖(overwrite),因此它继承 Guard Villagers 的模型、姿势、动画、盔甲和缩放,而不是复制它们。它不替换实体渲染器,因此应能与其他渲染模组共存。如果另一个模组也更改守卫的基础纹理,哪个获胜取决于注入顺序——请报告,这将会被记录在案。
仅测试了 Guard Villagers 1.6.19。声明的范围接受 1.6.x 补丁版本,但如果未来的 Guard Villagers 更改其渲染器,此模组会在加载时以 Mixin 错误大声失败,而不是静默地什么都不做。
本版本不含功能
- 通过用户名、UUID 或 URL 获取皮肤。仅限本地文件,这是有意为之。
- 服务器强制或同步的皮肤分配。
- 披风、鞘翅纹理、动画 PNG 或高清皮肤布局。
- 手动将特定皮肤固定到特定守卫。
皮肤权利
你自己文件夹中的皮肤是你自己的事。如果你在整合包中包含皮肤美术作品,请确保你有权分发该美术作品。 玩家皮肤是由人制作的,其中很多不允许自由再分发。
许可与致谢
GPL-3.0-only。源码位于 github.com/otectus/GuardsSkins。
Guard Villagers 由 TallestEgg 制作,是一个独立项目,拥有自己的条款——代码采用 MIT,资产保留所有权利。本模组未复制任何 Guard Villagers 资产,也未随附分发其 jar 文件。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。