1. 概述
SCUM 支持通过特定文件夹中的 JSON 文件创建和自定义任务,文件夹路径取决于你运行的是多人服务器,还是沙盒模式。对任务 JSON 文件的所有修改,都需要重启服务器(沙盒模式下重启游戏)才能生效。
这里提供一个图形化工具的链接,该工具通过简洁的图形界面简化任务创建流程,同时可确保输出的文件结构正确,且能基于游戏已知数据完成校验:
-
SCUMQuestTool
相关命令
-
#ExportQuests
自动创建任务文件夹(若文件夹不存在),并导出所有与任务相关的 JSON 文件,生成当前所有任务的快照。
-
#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对象」定义。其中部分属性为必填项,其余为可选项。
以下是完整的文件结构,后续会附带详细说明:
{
"AssociatedNPC": "Bartender",
"Tier": 1,
"Title": "My First Custom Quest",
"Description": "Help the Bartender with some tasks.",
"TimeLimitHours": 24,
"RewardPool": [
{
// 此处可填写1个或多个奖励对象
}
],
"Conditions": [
{
// 此处可填写1个或多个条件对象
}
]
}
奖励池(RewardPool)与条件(Conditions)的详细说明见后续章节。
4.1 必填属性
-
AssociatedNPC
-
类型:字符串(string)
-
可选值仅限:
Armorer(护甲商)、Banker(银行家)、Barber(理发师)、Bartender(酒保)、Doctor(医生)、Fisherman/Harbourmaster(渔夫/港务长)、GeneralGoods(杂货商)、Mechanic(机械师) -
作用:指定发布该任务的NPC,同时也是奖励(包括商店折扣奖励)的发放方。
-
-
Tier
-
类型:整数(integer),有效范围:1~3
-
作用:定义任务的难度或重要等级。
-
-
Title
-
类型:字符串(string)
-
作用:任务的标题名称,可填写任意合适的文本。
-
-
Description
-
类型:字符串(string)
-
作用:任务的简短描述,说明玩家需要完成的目标。
-
-
RewardPool
-
类型:奖励对象数组(array of Reward objects)
-
作用:每次生成该任务的新实例时,会从奖励池中随机选择1个奖励对象发放给玩家。
-
-
Conditions
-
类型:条件对象数组(array of Condition objects)
-
作用:定义完成任务所需达成的所有目标。
-
4.2 可选属性
-
TimeLimitHours
-
类型:数字(number,可为整数或小数)
-
作用:设置任务的完成时限,单位为小时(例如24、48.5等)。
-
若不填写该属性,则任务无时间限制。
-
5. 奖励对象
奖励池(RewardPool)数组中的每一项,都是一个奖励对象。SCUM 对单个奖励对象设置了最多5个奖励槽位的上限,槽位计数规则如下:
-
货币组(普通货币、金币、声望)
-
这三项无论你只填写其中1项(例如仅填写普通货币),还是三项全部填写,都仅占用1个奖励槽位。
-
-
技能
-
每一项技能经验奖励,单独占用1个奖励槽位。
-
示例:如果你同时发放弓箭和烹饪的技能经验,将占用2个奖励槽位。
-
-
交易优惠
-
单个奖励对象中,第一个交易优惠项占用2个奖励槽位。
-
同一个奖励对象中,每新增1个交易优惠项,额外占用1个奖励槽位。
-
注意:奖励的物品必须属于对应商人的库存列表。
-
以下是奖励槽位计数的示例:
{
"CurrencyNormal": 100,
"CurrencyGold": 1,
"Fame": 10,
"Skills": [
{
"Skill": "Cooking",
"Experience": 50
}
],
"TradeDeals": [
{
"Item": "Weapon_M9",
"Price": 50,
"Amount": 2,
"AllowExcluded": false,
"Fame": 10
}
]
}
-
普通货币(100) + 金币(1) + 声望(10) → 1个奖励槽位
-
烹饪技能+50经验 → 1个奖励槽位
-
首个交易优惠项 → 2个奖励槽位
以上总计占用4个奖励槽位,你还可以再添加1个技能、1个交易优惠项,或其他任意单个槽位的奖励内容,即可达到5个槽位的上限。
5.1 奖励对象属性
-
CurrencyNormal(整数 integer)
玩家可获得的普通货币数量。
-
CurrencyGold(整数 integer)
玩家可获得的金币数量。
-
Fame(整数 integer)
奖励的声望点数。
-
Skills(技能对象数组 array of Skill objects)
玩家可获得数组中每个技能对应的经验值。
-
TradeDeals(交易优惠对象数组 array of TradeDeal objects)
定义对应NPC商店中物品的折扣价或其他价格修改规则。
6. 技能对象
用于奖励对象内的
Skills 数组中。{
"Skill": "Cooking",
"Experience": 50
}
-
Skill(字符串 string)
必须为以下预定义的技能名称之一:
Archery(弓箭)、Aviation(飞行)、Awareness(感知)、Boxing(拳击)、Camouflage(伪装)、Cooking(烹饪)、Demolition(爆破)、Driving(驾驶)、Endurance(耐力)、Engineering(工程)、Farming(农耕)、Handgun(手枪)、Medical(医疗)、MeleeWeapons(近战武器)、Motorcycle(摩托驾驶)、Rifles(步枪)、Running(奔跑)、Sniping(狙击)、Stealth(潜行)、Survival(生存)、Tactics(战术)、Thievery(盗窃)-
Experience(整数 integer)
对应技能要发放的经验点数。
7. 交易优惠对象
用于奖励对象内的
TradeDeals 数组中。{
"Item": "Weapon_M9",
"Price": 50,
"Amount": 2,
"AllowExcluded": false,
"Fame": 10
}
-
Item(字符串 string)
物品的游戏内名称,与
#SpawnItem 命令中使用的名称一致。-
Price(整数 integer,可选)
物品的折扣(修改后)价格。不填写则保留默认价格。
-
Amount(整数 integer ≥ 1,可选)
折扣物品的可购买数量。
-
AllowExcluded(布尔值 boolean,可选)
若设置为
true,允许玩家购买该商人通常不出售的物品。-
Fame(整数 integer ≥ 0,可选)
购买该物品所需的声望要求。不填写则使用默认声望要求。
8. 条件对象
任务JSON对象中的
Conditions 数组,由1个或多个条件对象组成。每个条件可分为三类:Elimination(击杀)、Fetch(收集)、Interaction(交互)。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(字符串 string)
必须为
Elimination、Fetch 或 Interaction 三者之一。-
CanBeAutoCompleted(布尔值 boolean,默认值:false)
若为
false,玩家必须返回发布任务的NPC处才能完成该步骤。若为 true,达成要求后该步骤会自动完成。-
TrackingCaption(字符串 string,可选)
玩家的日志或任务追踪栏中,用于描述该步骤的文本。
-
SequenceIndex(整数 integer ≥ 0)
定义条件的激活顺序。
-
至少有1个条件的
SequenceIndex为0。 -
多个条件可使用相同的索引,所有同索引的条件全部完成后,任务才会进入下一个索引阶段。
-
LocationsShownOnMap(地图位置对象数组 array of MapLocation objects,可选)
在地图上为该条件的目标位置绘制圆形标记。
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(数字 number > 0)
地图上绘制的圆形标记的缩放比例(1.0对应约300米直径)。
8.2 击杀条件
用于击杀类任务要求:
{
"Type": "Elimination",
"TargetCharacters": [
"Puppet",
"Prisoner"
],
"Amount": 5,
"AllowedWeapons": [
"BP_Weapon_M1911_C",
"BP_Weapon_M9_C"
]
}
-
TargetCharacters(字符串数组 array of strings)
列出需要击杀的目标。可使用
#SpawnZombie(例如Puppet)或 #SpawnAnimal 中的生成名称,也可使用以下特殊占位符:-
Puppet:匹配所有傀儡丧尸 -
Prisoner:匹配所有玩家角色 -
Razor、Sentry、SentryOld -
ArmedNPC:匹配所有武装NPC
-
Amount(数字 number ≥ 1)
需要完成的击杀数量。
-
AllowedWeapons(字符串数组 array of strings,可选)
若填写该属性,仅使用指定武器完成的击杀才会计数。不填写则允许使用任意武器。
8.3 收集条件
用于物品收集或交付类任务要求:
{
"Type": "Fetch",
"DisablePurchaseOfRequiredItems": false,
"PlayerKeepsItems": false,
"RequiredItems": [
{
"AcceptedItems": [ "Apple" ],
"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(布尔值 boolean)
若为
true,任务激活期间,任何人都无法购买 RequiredItems 中列出的物品——仅当服务器开启了「禁止购买任务所需物品」设置时,该属性才会生效。-
PlayerKeepsItems(布尔值 boolean)
若为
true,任务完成后,物品不会从玩家的背包中移除。-
RequiredItems(物品对象数组 array of Item objects)
每个物品对象定义了需要收集的物品种类与数量要求。
8.3.1 物品对象
每个所需物品的属性说明:
-
AcceptedItems(字符串数组 array of strings)
物品名称列表,与
#SpawnItem 命令中识别的名称一致。-
RequiredNum(整数 integer ≥ 1)
需要收集的该物品基础数量。
-
RandomAdditionalRequiredNum(整数 integer ≥ 1,可选)
可能额外要求的随机数量(上限为填写的数值)。
-
MinAcceptedItemUses(整数 integer ≥ 0,可选)
若物品有使用次数,该属性要求物品至少剩余指定的使用次数。
-
MinAcceptedCookLevel / MaxAcceptedCookLevel(字符串 string,可选)
食物允许的烹饪等级范围。有效值:
Raw(生)、Undercooked(未煮熟)、Cooked(已煮熟)、Overcooked(煮过头)、Burned(烤焦)。-
MinAcceptedCookQuality(字符串 string,可选)
最低可接受的烹饪品质。有效值:
Ruined(损毁)、Bad(劣质)、Poor(较差)、Good(良好)、Excellent(优秀)、Perfect(完美)。-
MinAcceptedItemMass(数字 number ≥ 0.0,可选)
物品的最低重量要求,单位为克。
-
MinAcceptedItemHealth(数字 number 0.0~100.0,可选)
物品的最低耐久百分比要求。
-
MinAcceptedItemResourceRatio(数字 number 0.0~100.0,可选)
用于含液体的物品(例如水瓶),要求液体含量至少达到指定百分比。
-
MinAcceptedItemResourceAmount(数字 number ≥ 0.0,可选)
用于含液体的物品,要求液体含量至少达到指定克数。
8.4 交互条件
用于与地图上放置的物体进行交互的任务要求(例如扳动开关、收集笔记等)。
获取位置数据
在游戏内看向目标物体时,使用
#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(位置对象数组 array of Location objects)
每一项定义了游戏世界中的一个物体放置点或交互点。
-
MinNeeded / MaxNeeded(整数 integers)
随机决定玩家需要与多少个指定的位置对象完成交互。例如
MinNeeded = 1 且 MaxNeeded = 2 时,游戏会随机要求玩家完成1个或2个交互。-
SpawnOnlyNeeded(布尔值 boolean)
若为
true,仅会生成随机指定数量的物体。若为 false,会生成所有物体,但玩家只需交互足够数量即可完成要求。-
WorldMarkerShowDistance(整数 integer ≥ 0)
世界中标记的可见距离(单位:米),用于引导玩家找到物体的准确位置。
8.4.1 位置对象
-
AnchorMesh(字符串 string)
用于识别地图上的游戏内物体。
-
Instance(整数 integer,可选)
当多个相同模型的物体距离很近时,用于区分不同实例。
-
FallbackTransform(字符串 string)
当
AnchorMesh 失效时使用的位置/旋转数据(例如沙盒模式下会始终使用 FallbackTransform)。-
VisibleMesh(字符串 string)
要显示的3D模型。
可在任意位置放置使用的基础形状:
/Game/ConZ_Files/Models/BasicShapes/Shape_Cube.Shape_Cube
/Game/ConZ_Files/Models/BasicShapes/Shape_Cylinder.Shape_Cylinder
/Game/ConZ_Files/Models/BasicShapes/Shape_Plane.Shape_Plane
/Game/ConZ_Files/Models/BasicShapes/Shape_Sphere.Shape_Sphere
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
-
该任务由杂货商发布,
TradeDeals数组中的奖励优惠将应用于杂货商的商店。
-
Tier
-
等级1代表这是一个简单、低难度的任务。
-
RewardPool
-
玩家完成任务后,将获得100普通货币、5点声望、20点烹饪经验,同时可解锁一次菠萝的折扣购买权限。
-
Conditions
-
类型为
Fetch(收集),玩家需要提交3个耐久度不低于50%的苹果。 -
玩家必须返回杂货商处完成任务(
CanBeAutoCompleted: false)。 -
PlayerKeepsItems为true,因此任务完成后,玩家提交的苹果不会被移除。
-
创建或修改该文件后,重启你的服务器或游戏,任务即可生效。
10. 提示与最佳实践
-
为你的JSON文件做好备份,以便需要时回滚修改。
-
使用在线或本地的JSON校验工具验证文件格式,避免格式错误。
-
对于交互类型的条件,使用
#GetMeshInfo命令获取精准的位置数据。 -
如有条件,先在沙盒模式中测试你的任务,再添加到正式服务器环境中。
-
注意:你无法编辑默认任务,仅可屏蔽默认任务,或创建全新的自定义任务。
结论
按照本指南的步骤,你即可在SCUM中创建、自定义和管理属于自己的任务。无论你是想要屏蔽默认任务、添加带有独特条件的新任务,还是用货币、声望、折扣、技能经验奖励玩家,本文提供的JSON结构都涵盖了所有核心要点。
重要提示:修改JSON文件后,务必重启服务器或游戏,才能正确加载你的自定义任务。
QuestEditor_1.0.0.exe



没有评论内容