SCUM 自定义任务官方指南-⚙️ 服主专区社区-SCUM Games-SCUM游戏社区

SCUM 自定义任务官方指南

1. 概述

SCUM 支持通过特定文件夹中的 JSON 文件创建和自定义任务,文件夹路径取决于你运行的是多人服务器,还是沙盒模式。对任务 JSON 文件的所有修改,都需要重启服务器(沙盒模式下重启游戏)才能生效。
这里提供一个图形化工具的链接,该工具通过简洁的图形界面简化任务创建流程,同时可确保输出的文件结构正确,且能基于游戏已知数据完成校验:
  • SCUMQuestTool

相关命令

  • #ExportQuests
自动创建任务文件夹(若文件夹不存在),并导出所有与任务相关的 JSON 文件,生成当前所有任务的快照。
  • #GetMeshInfo
用于交互类任务的条件设置,可获取地图上的物体信息(例如用于放置可交互对象)。

2. 文件夹与文件结构

任务文件夹

根据你的使用场景,任务文件夹的路径如下:
  • 多人服务器
<Server>\SCUM\Saved\Config\WindowsServer\Quests
  • 沙盒模式
%LocalAppData%\SCUM\Saved\Config\WindowsNoEditor\Quests
该文件夹会在你首次运行 #ExportQuests 命令时自动创建。
在任务文件夹内,你会看到以下子文件夹:
  1. Blocked
    1. 包含 BlockedQuests.json 文件,可通过任务名称禁用(屏蔽)指定任务,也可一键屏蔽所有默认任务。
  2. Override
    1. 用于添加或更新自定义任务。当服务器启动(或沙盒模式下游戏启动)时,会解析该文件夹内的 JSON 文件,并加载所有新增或修改的任务。
  3. QuestList
    1. 包含 CustomQuestList.json(所有导出的自定义任务列表)和 DefaultQuestList.json(所有默认任务列表)。
    2. 编辑这些文件不会对服务器或游戏玩法产生任何影响,仅作参考用途。

屏蔽默认任务

如果你希望隐藏部分默认任务,可以使用 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 必填属性

  1. AssociatedNPC
    1. 类型:字符串(string)
    2. 可选值仅限:Armorer(护甲商)、Banker(银行家)、Barber(理发师)、Bartender(酒保)、Doctor(医生)、Fisherman/Harbourmaster(渔夫/港务长)、GeneralGoods(杂货商)、Mechanic(机械师)
    3. 作用:指定发布该任务的NPC,同时也是奖励(包括商店折扣奖励)的发放方。
  2. Tier
    1. 类型:整数(integer),有效范围:1~3
    2. 作用:定义任务的难度或重要等级。
  3. Title
    1. 类型:字符串(string)
    2. 作用:任务的标题名称,可填写任意合适的文本。
  4. Description
    1. 类型:字符串(string)
    2. 作用:任务的简短描述,说明玩家需要完成的目标。
  5. RewardPool
    1. 类型:奖励对象数组(array of Reward objects)
    2. 作用:每次生成该任务的新实例时,会从奖励池中随机选择1个奖励对象发放给玩家。
  6. Conditions
    1. 类型:条件对象数组(array of Condition objects)
    2. 作用:定义完成任务所需达成的所有目标。

4.2 可选属性

  1. TimeLimitHours
    1. 类型:数字(number,可为整数或小数)
    2. 作用:设置任务的完成时限,单位为小时(例如24、48.5等)。
    3. 若不填写该属性,则任务无时间限制。

5. 奖励对象

奖励池(RewardPool)数组中的每一项,都是一个奖励对象。SCUM 对单个奖励对象设置了最多5个奖励槽位的上限,槽位计数规则如下:
  1. 货币组(普通货币、金币、声望)
    1. 这三项无论你只填写其中1项(例如仅填写普通货币),还是三项全部填写,都仅占用1个奖励槽位
  2. 技能
    1. 每一项技能经验奖励,单独占用1个奖励槽位
    2. 示例:如果你同时发放弓箭和烹饪的技能经验,将占用2个奖励槽位。
  3. 交易优惠
    1. 单个奖励对象中,第一个交易优惠项占用2个奖励槽位
    2. 同一个奖励对象中,每新增1个交易优惠项,额外占用1个奖励槽位
    3. 注意:奖励的物品必须属于对应商人的库存列表。
以下是奖励槽位计数的示例:
{
  "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)
必须为 EliminationFetchInteraction 三者之一。
  • 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:匹配所有玩家角色
  • RazorSentrySentryOld
  • 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 = 1MaxNeeded = 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
        }
      ]
    }
  ]
}

示例说明

  1. AssociatedNPC
  1. 该任务由杂货商发布,TradeDeals 数组中的奖励优惠将应用于杂货商的商店。
  1. Tier
  1. 等级1代表这是一个简单、低难度的任务。
  1. RewardPool
  1. 玩家完成任务后,将获得100普通货币、5点声望、20点烹饪经验,同时可解锁一次菠萝的折扣购买权限。
  1. Conditions
    1. 类型为 Fetch(收集),玩家需要提交3个耐久度不低于50%的苹果。
    2. 玩家必须返回杂货商处完成任务(CanBeAutoCompleted: false)。
    3. PlayerKeepsItemstrue,因此任务完成后,玩家提交的苹果不会被移除。
创建或修改该文件后,重启你的服务器或游戏,任务即可生效。

10. 提示与最佳实践

  • 为你的JSON文件做好备份,以便需要时回滚修改。
  • 使用在线或本地的JSON校验工具验证文件格式,避免格式错误。
  • 对于交互类型的条件,使用 #GetMeshInfo 命令获取精准的位置数据。
  • 如有条件,先在沙盒模式中测试你的任务,再添加到正式服务器环境中。
  • 注意:你无法编辑默认任务,仅可屏蔽默认任务,或创建全新的自定义任务。

结论

按照本指南的步骤,你即可在SCUM中创建、自定义和管理属于自己的任务。无论你是想要屏蔽默认任务、添加带有独特条件的新任务,还是用货币、声望、折扣、技能经验奖励玩家,本文提供的JSON结构都涵盖了所有核心要点。
重要提示:修改JSON文件后,务必重启服务器或游戏,才能正确加载你的自定义任务。
 
QuestEditor_1.0.0.exe
请登录后发表评论

    没有评论内容