切换主题
SCUM自定义任务 - 中文说明文档
- 📄
1、介绍
SCUM允许你通过位于特定文件夹中的JSON文件来创建和自定义任务,具体文件夹取决于你是在运行多人服务器还是在沙盒模式下游玩。对任务JSON文件的所有更改都需要重新启动服务器(或在沙盒模式下重新启动游戏)才能使更改生效。
提供一个工具的链接,通过简单的图形界面简化创建过程,同时确保输出结构正确并与已知的游戏数据进行验证:
相关命令
复制指令
#Quests ListAllQuests
将所有默认任务的 JSON 数组复制到剪贴板。你可以将其粘贴到一个文件(例如 DisabledQuests.json)中,以阻止任何不希望出现的默认任务
复制指令
#ExportQuests
创建任务文件夹(如果该文件夹尚未存在),并导出与任务相关的 JSON 文件,提供所有当前任务的快照
复制指令
#Quests GetMeshInfo
用于交互条件以检索地图上的对象信息(例如,用于放置可交互对象)
- 📁
2、文件夹和文件结构
任务文件夹
根据你的设置,任务文件夹位于以下位置:
服务器路径复制路径
单机路径<Server>\SCUM\Saved\Config\WindowsServer\Quests
复制路径
%LocalAppData%\SCUM\Saved\Config\WindowsNoEditor\Quests
此文件夹会在你首次运行 #ExportQuests 命令时自动创建
在任务文件夹内,你会找到以下子文件夹:
Blocked(已阻止)
包含 BlockedQuests.json,它允许你通过名称阻止(禁用)某些任务或阻止所有默认任务
Override(覆盖)
用于添加或更新自定义任务。当服务器启动(或沙盒模式下的游戏)时,它会解析此文件夹中的 JSON 文件并应用任何新的或已更新的任务
QuestList(任务列表)
包含 CustomQuestList.json(导出的所有自定义任务列表)和 DefaultQuestList.json(所有默认任务列表)
编辑这些文件不会影响服务器或游戏玩法;它们仅用于参考
阻止默认任务
如果你希望阻止某些默认任务出现,可以使用Blocked文件夹中的 BlockedQuests.json 文件。只需添加你想要禁用的任务名称。例如:
复制指令
{
"BlockAllDefaultQuests": false,
"BlockQuestNames": [
"T1_AR_Fetch_45ACPAmmobox",
"T1_AR_Fetch_50AEAmmobox",
"T1_AR_Fetch_9mmAmmobox"
]
}
如果你想要禁用所有默认任务,请将BlockAllDefaultQuests设置为true
- ✍🏻
3、创建自定义任务
所有自定义任务必须作为每个文件中的一个 JSON 对象放置在Override文件夹中。每个文件描述一个任务。当服务器(或游戏)重新启动时,SCUM 将加载这些任务。
路径示例结构:
别复制了没用的
Quests
│
├── Blocked
│ └── BlockedQuests.json
├── Override
│ ├── MyFirstCustomQuest.json
│ └── MySecondCustomQuest.json
└── QuestList
├── CustomQuestList.json
└── DefaultQuestList.json
- 🪢
4、任务 JSON 文件的结构
你创建的每个任务都由一个具有特定属性的任务 JSON 对象定义。某些属性是强制的(bold),而其他属性是可选的(italics)。 以下是其结构,随后是详细解释:
复制示例
{
"AssociatedNPC": "Bartender",
"Tier": 1,
"Title": "我的第一个自定义任务【这个是任务名称命名,可以自定义名称】",
"Description": "帮助酒保完成一些任务。【这是一个任务描述,可自定义内容】",
"TimeLimitHours": 24,
"RewardPool": [
{
// 可在此处添加一个或多个奖励对象
}
],
"Conditions": [
{
// 可在此处添加一个或多个条件对象
}
]
}
稍后会详细介绍奖励池和条件
4.1 强制属性
每个任务 JSON 对象都必须包含以下强制属性:
属性名 | 类型 | 描述 |
---|---|---|
AssociatedNPC | 字符串 | 必须为这些之一:Armorer(武器商)、Banker(银行家)、Barber(理发师)、Bartender(酒保)、Doctor(医生)、Fisherman(渔夫)、GeneralGoods(杂货商)、Mechanic(机械师)。指示哪个 NPC 提供任务以及奖励(包括商店折扣奖励)的来源 |
Tier | 整数(范围:1 至 3) | 指定任务的难度或重要性等级 |
Title | 字符串 | 用于标记任务的合适文本 |
Description | 字符串 | 简要说明玩家需要做什么 |
RewardPool | 奖励对象的数组 | 每次生成任务的新实例时,从中随机选择一个奖励对象 |
Conditions | 条件对象的数组 | 定义完成任务必须满足的目标 |
4.2 可选属性
时间限制(小时)
类型:数字(可以是整数或小数)
设置完成任务的时间限制(以小时为单位)(例如,24、48.5 等)
如果没有时间限制,则省略此属性
- 🥳
5、奖励对象
奖励池数组中的每个条目都是一个奖励对象。SCUM 在每个对象中最多设置五个“奖励槽位”,计数方式如下:
货币(普通、金币、声望)组:
- 这三者共同计为 1 个奖励槽位——无论你只包含其中一个(例如仅包含普通货币)还是全部三个(普通货币、金币和声望)。
技能:
- 每授予一个技能计为 1 个奖励槽位。
- 示例:如果你在射箭和烹饪方面给予经验值,这就是 2 个奖励槽位。
交易优惠:
- 在同一个奖励对象中的第一个交易优惠计为 2 个奖励槽位。
- 在同一个奖励对象中的每个额外交易优惠计为 1 个奖励槽位。
- 授予的物品必须属于交易者的库存
下面是一个展示奖励计数如何工作的示例:
复制示例
{
"CurrencyNormal": 100,
"CurrencyGold": 1,
"Fame": 10,
"Skills": [
{
"Skill": "Cooking",
"Experience": 50
}
],
"TradeDeals": [
{
"Item": "BP_Weapon_M9_C",
"Price": 50,
"Amount": 2,
"AllowExcluded": false,
"Fame": 10
}
]
}
普通货币(100)+ 金币(1)+ 声望(10)→ 1 个奖励槽位
烹饪技能 +50 经验 → 1 个奖励槽位
第一个交易优惠 → 2 个奖励槽位
到目前为止,总计为 4 个奖励槽位。在达到 5 个的限制之前,你还可以添加一个技能或一个交易优惠(或任何单槽位奖励元素)
5.1、奖励对象属性
CurrencyNormal(整数) 玩家获得的普通货币金额。
CurrencyGold(整数) 玩家获得的金币金额。
Fame(整数) 授予的声望点数。
Skills(技能对象的数组) 玩家在此数组中的每个技能对象中获得技能经验。
TradeDeals(交易优惠对象的数组) 定义在对应 NPC 商店中的折扣或其他修改后的物品价格。
- 🕵🏻
6、技能对象
在奖励对象中的【Skills】数组内使用。
SkillName(字符串) 技能的名称(例如,“Cooking”、“Archery”等)。
Experience(整数) 授予该技能的经验值。
复制示例
{ "Skill": "Cooking",
"Experience": 50
}
- Skill(字符串) 必须是以下预定义技能名称之一:
英文 | 中文 |
---|---|
Archery | 射箭 |
Aviation | 航空 |
Awareness | 警觉 |
Boxing | 拳击 |
Camouflage | 伪装 |
Cooking | 烹饪 |
Demolition | 爆破 |
Driving | 驾驶 |
Endurance | 耐力 |
Engineering | 工程 |
Farming | 农业 |
Handgun | 手枪 |
Medical | 医疗 |
MeleeWeapons | 近战武器 |
Motorcycle | 摩托车 |
Rifles | 步枪 |
Running | 跑步 |
Sniping | 狙击 |
Stealth | 潜行 |
Survival | 生存 |
Tactics | 战术 |
Thievery | 盗窃 |
- Experience(整数) 授予该技能的经验值。
- 🕵🏻
7、交易优惠对象
在奖励对象中的TradeDeals数组内使用。
复制示例
{
"Item": "BP_Weapon_M9_C",
"Price": 50,
"Amount": 2,
"AllowExcluded": false,
"Fame": 10
}
Item(字符串) 游戏内物品的名称,与在 #SpawnItem 中使用的名称相同。
Price(整数,可选) 折扣(或更改后)的价格。省略则保持默认价格。
Amount(整数 ≥ 1,可选) 可用的折扣物品数量。
AllowExcluded(布尔值,可选) 如果设置为 true,则允许购买交易者通常不出售的物品。
Fame(整数 ≥ 0,可选) 购买物品所需的声望。省略则使用默认声望要求。
- 🕵🏻
8、条件对象
任务 JSON 对象中的Conditions数组包含一个或多个条件对象。每个条件可以是以下三种类型之一:消灭目标、获取物品或交互。
8.1、常见条件属性
复制示例
{
"Type": "Elimination",
"CanBeAutoCompleted": false,
"TrackingCaption": "Eliminate 3 puppets",
"SequenceIndex": 0,
"LocationsShownOnMap": [
{
"Location": { "X": 0.0, "Y": 0.0, "Z": 0.0 },
"SizeFactor": 1.0
}
]
}
Type(字符串)
- 必须是 “Elimination”(消灭目标)、“Fetch”(获取物品) 或 “Interaction”(交互)。
CanBeAutoCompleted(布尔值,默认:false)
- 如果为 false,玩家必须返回给任务 NPC 才能完成此步骤。如果为 true,满足要求后会自动完成。
TrackingCaption(字符串,可选)
- 用于描述此步骤在玩家日志或任务列表中的内容。
SequenceIndex(整数 ≥ 0)
- 定义条件激活的顺序。
- 至少一个条件必须有 SequenceIndex: 0。
- 多个条件可以共享相同的索引,所有这些条件都必须完成,任务才会进入下一个索引。
LocationsShownOnMap(地图位置对象数组,可选)
- 为此条件的位置在地图上绘制圆圈。
8.1.1、常地图位置对象
LocationsShownOnMap中的每个对象如下所示:复制示例
{"Location": { "X": 1000.0, "Y": 2000.0, "Z": 30.0 },
"SizeFactor": 1.0}
游戏中也可以使用 Ctrl+C 复制位置:
复制示例
{ "Location": "{X=-157607.328 Y=-687586.562 Z=667.976|P=353.113800 Y=101.191971 R=0.000000}",
"SizeFactor": 1.0}
Location(位置)
- 包含游戏世界中的 X、Y、Z 坐标
SizeFactor(缩放)(数字 > 0.0)
- 绘制圆圈的缩放比例(1.0 表示直径约 300 米)
8.2、消灭目标条件
用于击杀要求:
复制示例
{
"Type": "Elimination",
"TargetCharacters": [
"Puppet",
"Prisoner" ],
"Amount": 5,
"AllowedWeapons": [
"BP_Weapon_M1911_C",
"BP_Weapon_M9_C"]
}
TargetCharacters(目标角色数组)
- 列出必须被消灭的对象。可以包含在 #SpawnZombie(例如,Puppet)或 #SpawnAnimal 中使用的生成名称。特殊占位符包括:
- “Puppet”(匹配所有木偶)
- “Prisoner”(匹配所有囚犯角色)
- “Razor”、“Sentry”、“SentryOld” 等。
- 列出必须被消灭的对象。可以包含在 #SpawnZombie(例如,Puppet)或 #SpawnAnimal 中使用的生成名称。特殊占位符包括:
Amount(数量 ≥ 1)
- 需要的击杀次数。
AllowedWeapons(武器数组,可选)
- 如果存在,只有使用这些武器的击杀才会被计入。省略则允许使用任何武器。
8.3、获取物品条件
用于收集或交付物品:
复制示例
{
"Type": "Fetch",
"DisablePurchaseOfRequiredItems": false,
"PlayerKeepsItems": false,
"RequiredItems": [
{
"AcceptedItems": [ "BP_Apple_C" ],
"RequiredNum": 3,
"RandomAdditionalRequiredNum": 2,
"MinAcceptedItemUses": 1,
"MinAcceptedCookLevel": "Raw",
"MaxAcceptedCookLevel": "Cooked",
"MinAcceptedCookQuality": "Poor",
"MinAcceptedItemMass": 100.0,
"MinAcceptedItemHealth": 50.0,
"MinAcceptedItemResourceRatio": 20.0,
"MinAcceptedItemResourceAmount": 50.0
}
]
}
DisablePurchaseOfRequiredItems(禁止购买所需物品)(布尔值)
- 如果为 true,则在任务活跃期间,任何人无法购买 必需品 列表中的物品——仅在服务器启用了 阻止购买必需品 设置时相关。
PlayerKeepsItems(玩家保留物品)(布尔值)
- 如果为 true,则任务完成后,物品不会从玩家的库存中移除。
RequiredItems(所需物品数组)(物品对象数组)
- 每个物品对象指定必须收集的物品及其数量。
8.3.1、物品对象
每个所需物品的属性:
英文名称 | 中文名称 | 数值 | 介绍 |
---|---|---|---|
AcceptedItems | 可接受物品 | 字符串数组 | 通过 #SpawnItem 识别的物品名称列表。 |
RequiredNum | 所需数量 | 整数 ≥ 1 | 必须收集的这些物品的数量。 |
RandomAdditionalRequiredNum | 随机额外所需数量 | 整数 ≥ 1 | 可选,可能需要的随机额外数量(最多为指定的数字)。 |
MinAcceptedItemUses | 最小可接受物品使用次数 | 整数 ≥ 0 | 可选,如果适用,物品必须至少有此使用次数。 |
MinAcceptedCookLevel / MaxAcceptedCookLevel | 最小/最大可接受烹饪等级 | 字符串 | 可选,食物允许的烹饪等级范围。有效等级:“生的”、“未煮熟的”、“煮熟的”、“过熟的”、“烧焦的”。 |
MinAcceptedCookQuality | 最小可接受烹饪质量 | 字符串 | 可选,最低可接受的烹饪质量:“糟糕的”、“差的”、“一般的”、“好的”、“优秀的”、“完美的”。 |
MinAcceptedItemMass | 最小可接受物品质量 | 数字 ≥ 0.0 | 可选,以克为单位,物品的质量必须至少为该值。 |
MinAcceptedItemHealth | 最小可接受物品健康度 | 0.0 到 100.0 范围内的数字 | 可选,所需的物品最低健康度百分比。 |
MinAcceptedItemResourceRatio | 最小可接受物品资源比例 | 0.0 到 100.0 范围内的数字 | 可选,用于含有液体的物品(例如,水瓶)。必须至少有该百分比的液体。 |
MinAcceptedItemResourceAmount | 最小可接受物品资源量 | 数字 ≥ 0.0 | 可选,用于含有液体的物品。必须至少有该克数的液体。 |
8.4、交互条件
用于与放置在地图上的物体进行交互(例如,翻转开关、收集笔记等)
获取位置数据
在游戏中查看物体时使用#Quests GetMeshInfo来捕捉其网格名称、实例、变换等信息。它会将一个 JSON 片段复制到剪贴板,你可以直接将其粘贴到任务文件中。
复制示例
{ "Type": "Interaction",
"Locations": [{
"AnchorMesh": "/Game/World/SomeMap/BP_Switch.BP_Switch_C",
"Instance": 4,
"FallbackTransform": "X=123.456 Y=234.567 Z=10.0 Pitch=0 Yaw=0,Roll=0",
"VisibleMesh": "/Game/World/SomeMap/BP_SwitchModel.BP_SwitchModel_C" },
{
"AnchorMesh": "/Game/World/SomeMap/BP_Door.BP_Door_C"
}],
"MinNeeded": 1,
"MaxNeeded": 2,
"SpawnOnlyNeeded": true,
"WorldMarkerShowDistance": 50}
Locations(位置数组)(位置对象数组)
- 每个位置对象定义世界中的一个物体放置点或交互点。
MinNeeded / MaxNeeded(最小/最大需要)(整数)
- 随机确定玩家必须与指定位置对象中的多少个进行交互。例如,如果 MinNeeded = 1 且 MaxNeeded = 2,游戏将决定需要 1 次或 2 次交互。
SpawnOnlyNeeded(仅生成需要的)(布尔值)
- 如果为 true,则仅生成随机确定数量的物体。如果为 false,则生成所有物体,但玩家只需与足够数量的物体交互以满足要求。
WorldMarkerShowDistance(世界标记显示距离)(整数 ≥ 0)
- 标记在世界中可见的距离(以米为单位),引导玩家到达物体的确切位置。
8.4.1、位置对象
AnchorMesh(锚点网格)(字符串)
- 识别地图上的游戏内对象。
Instance(实例)(整数,可选)
- 如果相同网格的多个副本靠近在一起,则使用此属性进行区分。
FallbackTransform(备用变换)(字符串)
- 如果 AnchorMesh 失败(例如,在沙盒模式下始终使用 FallbackTransform),则使用的位移/旋转数据。
VisibleMesh(可见网格)(字符串)
- 要显示的 3D 模型。
- 🛰️
9、示例任务【将所有内容整合在一起】
下面是一个简单且完全详细的自定义任务 JSON 文件示例。将此文件保存为 MyFirstQuest.json(或任意名称)到 Override 文件夹中
复制示例
{
"AssociatedNpc": "GeneralGoods",
"Tier": 1,
"Title": "General Goods trader's Special",
"Description": "Collect apples for the General Goods trader and get a small reward.",
"TimeLimitHours": 24.0,
"RewardPool": [{
"CurrencyNormal": 100,
"Fame": 5,
"Skills": [{
"Skill": "Cooking",
"Experience": 20}],
"TradeDeals": [
{
"Item": "Pineapple",
"Price": 50,
"Amount": 1,
"Fame": 0 } ] } ],
"Conditions": [{
"TrackingCaption": "Gather apples",
"SequenceIndex": 0,
"CanBeAutoCompleted": false,
"Type": "Fetch",
"DisablePurchaseOfRequiredItems": false,
"PlayerKeepsItems": true,
"RequiredItems": [{
"AcceptedItems": [
"Apple_2"],
"RequiredNum": 3,
"MinAcceptedItemHealth": 50.0}],
"LocationsShownOnMap": [{
"Location": {
"X": 1000.0,
"Y": 2000.0,
"Z": 50.0},
"SizeFactor": 1.0} ]}]}
说明
AssociatedNPC(关联 NPC)
- 酒保将提供任务,交易优惠数组中的奖励适用于酒保的商店。
Tier(等级)
- 等级 1 表示一个简单或低级的任务。
RewardPool(奖励池)
- 玩家完成任务后将获得 100 普通货币、5 点声望、20 点烹饪经验,并可以折扣价购买 M9 手枪。
Conditions(条件)
- 类型为获取。玩家必须带来 3 个苹果(AcceptedItems: BP_Apple_C),且苹果的健康度至少为 50%。
CanBeAutoCompleted(可自动完成)
- 玩家必须返回酒保处(CanBeAutoCompleted: false)以最终完成任务。
PlayerKeepsItems(玩家保留物品)
- PlayerKeepsItems 为 true,因此完成任务后玩家不会失去苹果。
创建或修改此文件后,需要重启服务器或游戏才能使任务生效。
- 🙆🏻♂️
10、建议和最佳实践
- 备份 JSON 文件:保留 JSON 文件的备份,以便在需要时恢复更改。
- 验证 JSON:使用在线或本地 JSON 验证工具来防止格式错误。
- 获取准确的放置数据:对于交互类型条件,使用 #Quests GetMeshInfo 获取准确的放置数据。
- 在沙盒模式下测试任务:如果可能,在将任务添加到实时服务器环境之前,先在沙盒模式下进行测试。
- 无法编辑默认任务:记住你无法编辑默认任务。你只能阻止它们或创建全新的任务。
- 💕
总结
通过遵循本指南,你应该能够在 SCUM 中创建、自定义和管理自己的任务。无论你是想阻止默认任务,添加具有独特条件的新任务,还是通过货币、声望、折扣或技能经验奖励玩家,上述提供的 JSON 结构涵盖了所有要点。
重要提示: 在对 JSON 文件进行更改后,务必重新启动服务器或游戏,以便你的自定义任务能够正确加载。
享受使用自定义任务打造独特的 SCUM 体验吧!
⩥ 编译:白木『QQ:2819066121』
🥳 校对名单:...招募校对、维护伙伴...有兴趣可联系白木❤️
♥内容原创归属:SAM • 游戏社区
⩥⩥ 「 鸣谢列表 」