守卫村民皮肤

守卫村民皮肤

将普通的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. 安装适用于 1.20.1 的 Forge。
  2. 将两个 jar 文件放入你的 mods/ 文件夹:
    • guardvillagers-1.20.1-1.6.19.jar
    • guardvillagerskins-0.1.0.jar(本模组)
  3. 启动一次。 这会创建 config/guard_skins/ 和 config/guardvillagerskins-client.toml。
  4. 打开 Guard Villagers 的玩家模型选项。 打开 config/guardvillagers-client.toml 并设置:
   "Have guards use the steve model?" = true

然后重启游戏。 Guard Villagers 在启动时只选择一次模型——在游戏过程中更改此设置不会生效,直到下次启动。这几乎让所有人中招,所以 /guardskins status 会明确报告实时状态。

  1. 将 64×64 像素的玩家皮肤 PNG 文件放入 config/guard_skins/。
  2. 按 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 文件。