北欧_性格_建造_系统

创作者: VentureValheim
已更新:2024-06-01 02:31:01
154KB

前置 MOD

使用 北欧_性格_建造_系统 时将自动安装

关于此 MOD

服务器任务框架。创建你自己的NPC并赋予他们目标!

北欧人格构建系统

一个面向服务器的任务框架。创建你自己的NPC并赋予他们目标!非常适合角色扮演服务器!

支持我!

感谢所有在抢先体验期间使用过我模组的人。你们所有的反馈和支持,让投入这些项目的数百小时都变得值得。尽管做模组从来没有真正带来过现金回报,但它回馈给我的,是朋友、社区,以及更多欢乐时光!对于这些年来所有请我喝过咖啡的人,我非常感激你们的善意!

如果你想继续支持我模组的开发和维护,可以通过下方的图片链接请我喝杯咖啡。

正在寻找英灵神殿服务器?我已与Survival Servers合作,使用优惠码即可享受75折优惠 瓦尔海姆25!通过点击下方图片中的链接下单,我将获得一部分收益。你得到一个可以和朋友们一起玩的服务器,而我可以去买更多香甜的咖啡,让模组继续运转下去!

版本0.1.0+升级

如果你的世界版本是0.0.7——更新可能会破坏你当前的NPC!!!!!

这是警告。你已经被警告过了。

我已尽力让过渡自然流畅,但仍不完美。

免责声明!

这个模组还没做完!还有很多功能有待添加。非常欢迎大家针对目前支持的功能提出反馈。请参阅本自述文件底部列出的未来可能改进项以及贡献相关信息。

感谢所有尝试过这个模组首个测试版的人!你们的热情让我感到非常欣慰和鼓舞!

功能

  • 创建你自己的自定义NPC角色并为他们分配不同的功能,包括:
    • 任务:给玩家一条任务线。包括对话、奖励物品或控制游戏行为的密钥。
    • 佣兵:可雇佣,会为玩家作战。(未完成)
    • 击杀目标:击败此NPC以获取奖励。(未完成)
    • 商人:经营一家类似哈尔多/希尔迪尔的商店。
  • NPC可以有随机移动和动作,比如坐在椅子上。(未完成)
  • NPC会像玩家一样行动,被击杀后默认会复活。
  • NPC可以设为永久死亡,玩家可以选择何时埋葬尸体。

全局与玩家专属键

什么是钥匙,它们控制什么?在原版《英灵神殿》中存在一个“全局钥匙”列表,它是一组由所有玩家共享的字符串(词语)。此外还有原版“玩家唯一钥匙”;这些钥匙为每位玩家单独保存。世界中的生成、袭击、梦境以及哈尔多的物品都由特定钥匙的存在与否来控制。每个boss、游戏中的特定生物,以及希尔迪的任务,各自都有与其完成状态相关联的钥匙。本模组也添加了钥匙,并利用现有的原版系统来控制游戏行为。

这个模组可以同时添加到全局钥匙和玩家独有钥匙系统中。任务奖励可以自定义为适用于所有玩家,或仅适用于完成该动作的玩家。当此模组检查钥匙是否存在时,它会同时检查这两个列表。这将在下方提供的示例中说明。

世界发展与进度模组

这个模组将与WAP的私钥系统完美搭配。如果NPC配置为使用全局钥匙,那么只有接收玩家半径约100米内的玩家会获得钥匙。如果你希望区域内所有玩家都获得钥匙,则在NPC配置中使用“全局”设置。这允许你的玩家组队共同完成任务。否则使用“玩家”设置来实现真正的个人进度。未指定时,模组将默认为“玩家”。

如果你希望允许某些键值成为全局键值,可以使用进度模组的高级配置,将这些键值添加到全局列表中。这对于你只想让一名玩家完成的副本任务很有用,或者如果你只想要求一名玩家执行某个操作,就能为整个服务器解锁某条副本任务线。

注意:当《英灵神殿》正式发布后,WAP将经历一些重大改动,这些改动可能会改变这些模组之间的互动方式。

新手指南

目前有三种生成NPC的方式:使用 右Ctrl + E 在床上或椅子上, 生成随机NPC 控制台命令,或来自带有该命令的配置 已保存NPC生成点。随机NPC将全部为默认NPC类型none,并拥有随机风格。除了为世界增添杂乱与生气之外,它们没有任何功能。要自定义NPC并赋予其功能,你需要先使用YAML文件定义它们。下一节将说明此过程。

所有NPC都会像玩家一样,死亡后自动在原始出生点重生。如果你想让某个NPC真正死亡,你必须为其设置以下任一选项: 设置NPC真死 命令中或NPC的yaml配置中设置。在真死亡状态下,NPC布娃娃不会消失,直到玩家与布娃娃互动将其移除。

默认情况下,所有NPC都会随机移动,你可以使用控制台命令 NPC设为静止 让它们停止移动,或者编辑yaml配置让它们生成后保持静止。

请在下方“命令”部分查看所有可用命令。

使用YAML文件

有一个随模组附带的文件,名为 Example.VV.NPCS.yaml 在config文件夹中包含示例。此文件必须手动重命名为 VV.NPCS.yaml 加载模组时,这样可以防止模组更新覆盖你的配置。你可以在此文件中定义自定义NPC,以便在游戏中生成它们。你还可以通过这些配置更新现有的NPC,而无需将它们从游戏中移除。当你更新现有NPC时,它将被覆盖,并丢失之前与其关联的所有数据。

  • 此文件在游戏运行时若被修改,不会自动实时更新,但有一条命令 重新加载NPC配置 强制重新加载它。
  • 如果你的NPC配置中缺少某些信息,它将被设置为默认值,并且不应引发错误。
  • 如果看到错误,请检查你是否为配置使用了正确的数据类型,并且没有拼写错误。错误信息应该会告诉你文件中是哪一行导致了问题。

这个 yaml 文件是本地文件,不会同步给其他人。服务器上不需要这个文件,模组运行也不需要它。它纯粹是用于设置,如果你想自定义 NPC 的话。一旦你的 NPC 在世界中生成,数据就会保存到该对象上,因此也会保存在世界文件中。

文件有问题?复制粘贴一个与你想要的内容完全接近的示例。Yaml文件对缩进有严格要求。错误的制表符、空格或其他字符都可能导致错误,使文件无法加载。

如果你在设置过程中遇到问题,随时可以寻求支持(见底部的贡献部分)。

NPC类型

可接受类型包括:无、任务、佣兵、击杀目标、商人

任务

这些NPC可以在被交互时简单地说点什么,或者能够接受物品/钥匙以换取奖励物品/钥匙。要自定义NPC的行为和对话,你需要使用YAML文件为其定义特定数据。

任务NPC的构建基础是“任务”列表。NPC的任务列表会按照定义的顺序依次尝试完成。对于同一名玩家,一个NPC同一时间只能有一个激活的任务。建议将任务线中的最后一个任务设为“默认文本”(不定义任何约束条件),即你希望NPC说的话。如果任务线中其他所有任务都设有约束条件,且对某名玩家而言均不满足,则会选中这最后一个任务。这样可以防止你的NPC“无事可做”。各示例将在下方对应的NPC类型下进行说明。

简单是关键。如果单个NPC上的任务变得极其冗长复杂,服务器发送数据、客户端筛选当前可用任务时就可能导致卡顿。一个区域内NPC越多,卡顿就越严重。如果遇到问题,试着把NPC分散到不同区域,或者把任务拆分给其他NPC。

示例1:诸神黄昏启示录

以下是一对NPC的示例。与Ragnar1互动时,他会给出钥匙“ragnarbrave”,而Ragnar2需要这把钥匙才会告诉你一个秘密。Ragnar1只会告诉你一次他们的秘密,所以你最好注意听!notRequiredKeys字段用于“跳过”任务,一旦存在此钥匙,该任务将不再符合条件,并会尝试选择列表中的下一个任务。这些钥匙被设置为“Global”,因此只有第一个访问该任务的玩家才能看到Ragnar1的interactText和Ragnar2的rewardText(除非你有其他修改此行为的模组)。

请注意,这两者都设置为生成时原地不动,这在设置东西时非常有用。

npcs: - id: Ragnar1 name: 勇敢的拉格纳 standStill: true type: Quest quests: - text: "这里有一些关于大胆的拉格纳的传闻!" notRequiredKeys: ragnarbrave interactKey: ragnarbrave interactKeyType: Global - text: "你刚才是说你带了蜂蜜酒吗?" - id: Ragnar2 name: 大胆的拉格纳 standStill: true type: Quest quests: - text: "你见过勇敢的拉格纳吗?" notRequiredKeys: ragnarbold requiredKeys: ragnarbrave rewardText: "他这么说了?让我告诉你一个关于勇敢的拉格纳的秘密。" rewardKey: ragnarbold rewardKeyType: Global - text: "我最爱喝上一杯好蜂蜜酒了。"

示例2:一个小村庄

这是一个示例,展示了四个NPC,你需要按顺序与他们对话并完成他们的任务。

长话短说:利夫会奖励一把2星燧石刀,维维卡会接受并给出拉沙哈的任务,让他带鹿肉炖菜来换取金币。随后领主会奖励你一把铁剑,感谢你帮助他们所有人。

莉芙被设置为玩家第一次与她交谈时给玩家一把刀。之后这个NPC会一直询问你是否完成了任务,直到你收到任务奖励钥匙“vivica2”。一旦这两个阶段都完成,莉芙就会默认重复最后一段任务文本。由于 交互键类型 如果此处未指定,将默认为“Player”。这意味着所有玩家都能完成该任务。

薇薇卡的设定是,你必须先和莉芙对话,才能看到她在第一个任务中的奖励文本。之后,在第二个任务中给她所需物品时,她会说出奖励文本并进入第三个任务,该任务会提醒你你的目标。在你获得“rahshahs2”钥匙后,薇薇卡将默认切换到列表中的最后一个任务。

与薇薇卡类似,在完成授予“vivica2”钥匙的任务之前,拉沙斯也会无视你。他会要求鹿肉炖菜,但不会从玩家身上移除该物品,他会改变主意不再需要它,但依然会给予玩家奖励。

最后,当所有其他NPC的任务线都完成后,领主会因为你帮助了他所有的子民而给你一份奖励。

这可能有点令人困惑。试着生成这些示例并在游戏中进行交互,看看它们是如何工作的。

这里需要注意``interactKey``和``rewardKey``之间的区别,因为与NPC对话时``interactKey``总会给予玩家,而``rewardKey``只会在满足奖励条件时给予。
在设置NPC文本时,你可以使用两个“关键词”:**{giveitem}**和**{reward}**,它们会自动替换为对应的预制体和数量,这样你就不用手动输入了。这在调试时很有用。
npcs:
- id: Liv
  name: 睿智的莉芙
  type: Quest
  quests:
  - text: "你能把这个带给薇薇卡吗?她太害羞了,不肯承认她需要我的帮助。"
    notRequiredKeys: liv
    rewardItems:
    - prefabName: KnifeFlint
      quality: 2
    rewardKey: liv
  - text: "你把那把刀带给薇薇卡了吗?"
    notRequiredKeys: vivica2
  - text: "天气真好,不是吗?"
- id: Vivica
  name: 薇薇卡
  type: Quest
  quests:
  - text: "我太忙了,没空说话。"
    requiredKeys: liv
    notRequiredKeys: vivica1
    rewardKey: vivica1
    rewardText: "莉芙派你来的?我想我确实需要些帮助。我需要一把更锋利的刀。"
  - text: "我需要{giveitem}。"
    requiredKeys: vivica1
    notRequiredKeys: vivica2
    giveItem:
      prefabName: KnifeFlint
      quality: 2
    rewardKey: vivica2
    rewardText: "我丈夫拉赫沙赫斯可能也需要帮忙,你能找到他吗?"
  - text: "你找到拉赫沙赫斯了吗?"
    notRequiredKeys: rahshahs2
  - text: "我喜欢大海的气息。"
- id: MrHamHands
  name: 拉赫沙赫斯
  type: Quest
  quests:
  - text: "你想干什么?走开。"
    requiredKeys: vivica2
    notRequiredKeys: rahshahs1
    rewardKey: rahshahs1
    rewardText: "薇薇卡派你来的?她没付你钱!?"
  - text: "我需要{giveitem},作为交换我会给你{reward}。"
    requiredKeys: vivica2
    notRequiredKeys: rahshahs2
    giveItem:
      prefabName: DeerStew
      amount: 1
    removeItem: false
    rewardItems:
    - prefabName: Coins
      amount: 10
    rewardKey: rahshahs2
    rewardText: "谢谢,但薇薇卡已经找到我了,你留着吧!我妻子的事很抱歉,这些应该足够报答你的帮助了。"
  - text: "感谢你的帮助。"
- id: Jarl
  name: 雅尔·哈尔辛
  type: Quest
  quests:
  - text: "帮助我的人民,我会给你{reward}。"
    requiredKeys: liv, vivica2, rahshahs2
    notRequiredKeys: thaneofvalheim
    rewardItems:
    - prefabName: SwordIron
      quality: 5
    rewardText: "你真的做到了,我很佩服!"
    rewardKey: thaneofvalheim
  - text: "你好啊,市民。"

佣兵

未完成。

击杀目标

未完成。

商人

商人像哈尔多和其他原版商人一样运作。你可以指定他们出售和购买的物品,使用金币作为货币。

"Texts" 字段必须为商人存在,如果在配置中留空,它们将在游戏中显示为空白浮动框。这是原版代码工作方式的副作用。

示例


  - id: Wildir1 name: 威尔迪尔 type: 商人 tradeItems: - prefabName: 石头 amount: 20 cost: 5 requiredKey: gave_pickaxe - prefabName: 木材 amount: 20 cost: 5 - prefabName: 石斧 quality: 2 cost: 200 traderUseItems: - prefabName: 鹿角镐 rewardKey: gave_pickaxe removeItem: true text: "嘿,谢谢,有了这个我就能多采些石头了。" talkTexts: - "天气真好。" - "松树的气味让我心情舒畅。" - "我真该换把新镐子了。" greetTexts: - "你好啊!" goodbyeTexts: - "漫长的一天开始前,记得把斧头磨快!" startTradeTexts: - "需要什么吗?" - "我这有最好的木材!" buyTexts: - "谢谢,欢迎再来!" sellTexts: - "这个品质还行。" notCorrectTexts: - "嗯……" notAvailableTexts: - "我已经有需要的东西了。"

NPC杂项YAML字段

文本

如果你想让你的NPC在不与它们互动的情况下说话,请使用 对话文本, 问候语, 再见文本,以及 激怒文本 字段。这仅适用于带有MonsterAI脚本的NPC。这包括任何通常会攻击玩家的生物类型。例如,鹿是AnimalAI,由于原版代码的工作方式,无法使用这些字段。

生命值

默认情况下,NPC的生命值会与其原版对应角色保持一致。使用 最大生命值 设置为其他数值。

给予默认物品

默认情况下,NPC会被赋予一套与其原版对应角色相似的随机默认物品。如果你希望NPC没有任何物品、护甲或攻击设置 给予默认物品 为 false。(Khordus——这就是你制作糖果的方法)

更新样式(装备随机化)

默认情况下,如果yaml文件中排除了某些字段,NPC在生成时以及每次更新时都会随机化。如果你不希望在更新时刷新或随机化装备,请设置 更新样式 设为 false。如果你在放置 NPC 后对其进行了修改,但之后需要更改其任务或商店物品,这会很有用。

阅读下方内容,了解更多样式设置。

真死

设置 真死 为 true 时,NPC 被击败后会死亡,永远不会重生。默认情况下,所有 NPC 都会在最初生成的位置重生。

站着别动

当设置为 true 时,NPC 在生成后会保持静止。

动画

如果模型支持,此字段可设置你的NPC执行特定动画。对于玩家NPC类型,这包括以下内容: 蹲伏, 跳舞, 坐下,以及其他表情动作。大多数动画需要将NPC设置为站立不动才能生效。

目前许多动画只会播放一次。例如: NPC保持静止 表情_不不不.

该系统的改进已计划在未来的更新中推出。

NPC风格

有些字段可用于通过物品预制体名称来设置NPC的外观。未指定的内容将留空或随机化。皮肤和头发颜色需要定义所有r、g、b值才能覆盖;它们是0到1之间的浮点值。覆盖颜色可以让你创建一些非常奇怪的角色。当这些颜色从yaml中排除时,它们将被随机化为任何可能的原版自定义值。有命令可以从现有NPC获取这些值,因此你可以生成一组随机生成的NPC,从而很快找到可能的原版值。

从yaml文件生成NPC时,它会自动保留原始预制体上存在的常用默认物品(包括其徒手攻击)。要移除默认攻击、武器、衣服和其他物品,请设置 给予默认物品 为false。这样你就可以完全自定义你的NPC了。

如果你想故意让某些字段留空(比如胸甲,嘿,我不评判),你必须用空字符串来指定这些值,例如 宝箱:"" 防止某些字段被随机化。

npcs: - id: Ragnar3 name: 盛装的拉格纳 model: Player modelIndex: 0 hair: Hair1 beard: Beard1 helmet: HelmetHat1 chest: ArmorTunic1 legs: ArmorLeatherLegs shoulder: CapeLinen shoulderVariant: 2 utility: BeltStrength rightHand: KnifeFlint leftHand: Torch leftHandVariant: 1 - id: Clown name: 小丑克利波 type: None model: Player modelIndex: 0 hair: Hair19 helmet: "" chest: ArmorTunic6 legs: ArmorRagsLegs skinColorR: 0.9 skinColorG: 0.8 skinColorB: 0.1 hairColorR: 0.2 hairColorG: 0.3 hairColorB: 0.9 - id: Boar name: 一只精致的标本 model: Boar giveDefaultItems: false type: Quest interactText: "喂我,人类!"

支持的型号

本模组目前仅支持以下原版模型。若未指定模型,则默认为玩家类型:

  • 玩家
  • 亚斯克文
  • 野猪
  • 焦黑近战
  • 鹿
  • 尸鬼
  • 矮人
  • 芬里尔
  • 芬里尔邪教徒
  • 幽灵
  • 哥布林
  • 哥布林萨满
  • 灰矮人
  • 灰灵
  • 洛克
  • 颈部
  • 骷髅
  • 巨魔
  • 狼

指令

你可以在椅子或床上生成一个随机NPC,使用 右Ctrl + E (未来可能会有所变动)。

指令 参数 描述
重新加载NPC配置 重新加载 YAML 文件中的所有更改
随机生成NPC [名称] [模型] 生成一个随机NPC(仅支持特定模型)
NPC生成已保存 [ID] 从yaml配置中生成一个NPC
移除NPC 删除最近的NPC,请谨慎使用!
NPC信息 列出最近NPC的物品
随机化NPC 槽位 完全随机化最近的NPC,或仅随机化指定的自定义槽位
NPC设置 [id] 从 yaml 配置更新最近的 NPC
设置NPC移动 [动画] 更新最近的NPC使其四处走动
NPC静止 [动画] 将最近的NPC更新为原地站立
NPC设置坐下 将最近的NPC更新为坐在最近的椅子上
NPCs恢复平静 半径 安抚指定半径内的所有敌对NPC
设置NPC真实死亡 将最近的NPC更新为下次死亡后不再重生
设置NPC面向我 让最近的NPC转向你
获取NPC肤色 返回最近NPC的肤色
获取NPC发色 返回最近NPC的发色

未来可能的改进

  • NPC死亡掉落物品选项。
  • NPC选项可以执行更多种类的动作,而不仅仅是坐着、站着或走路。
  • 改进的动画系统,支持循环动画、在任务阶段播放动画等。
  • 随机生成的NPC名字。
  • 更多NPC模型选项。
  • 带标识的坟墓,让你能好好悼念死去的NPC。
  • 完成任务后的冷却计时。
  • 在玩家完成动作后移除其钥匙的能力。
  • 允许更改/设置NPC阵营和组别。
  • UI中的玩家任务追踪器。
  • 更便捷地列出/保存/更改/复制NPC信息。
  • 为阵亡NPC提供的死灵法术选项。
  • 翻译选项。
  • 更复杂的数据:
    • 物品/攻击:能够为一个NPC分配多种武器和攻击方式。
  • 商人:可更改货币类型。
  • 事物音效。

安装

此模组需要在客户端和服务端同时安装;模组会强制要求安装。未安装此模组的玩家将无法连接到服务器。

如果在生成NPC后从服务器移除该模组,它们将会消失。

更新日志

已移动到新文件,它将作为新标签页显示在 Thunderstore 页面上。

贡献者

所有问题都可以在Discord或项目Github上报告。报告问题时,请尽可能具体,并提供以下信息:

  1. 有问题的模组名称和版本。
  2. 出现问题时生成的 Bepinex\Logoutput.log 文件(或至少列出所有其他正在使用的模组)

欢迎所有反馈、想法和请求!你可以在我的Discord上给我留言。 冒险游戏.

Valheim: 英灵神殿 的热门 MOD

探索适用于 Valheim: 英灵神殿 的最佳MOD,带来新功能、升级画面,以及令人兴奋的方式来改变您的游戏体验。

使用 Xmod 解锁 Valheim: 英灵神殿 的全部潜力 — 今天就探索这些顶级 MOD!