Skip to content

第 5.5 章:服务器配置文件

首页 | << 上一章:ImageSet 格式 | 服务器配置文件 | 下一章:出生装备配置 >>


摘要: DayZ 服务器通过任务文件夹(例如 mpmissions/dayzOffline.chernarusplus/)中的 XML、JSON 和脚本文件进行配置。这些文件控制物品生成、经济行为、游戏规则和服务器身份标识。理解它们对于向战利品经济中添加自定义物品、调整服务器参数或构建自定义任务至关重要。


目录


概述

每个 DayZ 服务器都从任务文件夹加载其配置。中央经济系统(CE)文件定义哪些物品在哪里生成、持续多长时间。服务器可执行文件本身通过 serverDZ.cfg 配置,该文件位于可执行文件旁边。

文件用途
init.c任务入口点 --- Hive 初始化、日期/时间、出生装备
db/types.xml物品生成定义:数量、生存时间、位置
cfgspawnabletypes.xml生成实体上预附加的物品和货物
cfgrandompresets.xmlcfgspawnabletypes 使用的可复用物品池
db/globals.xml全局经济参数:最大计数、清理计时器
cfggameplay.json游戏调整:体力、基地建造、UI
cfgeconomycore.xml根类注册和 CE 日志
cfglimitsdefinition.xml有效的类别、用途和值标签定义
serverDZ.cfg服务器名称、密码、最大玩家数、Mod 加载

init.c --- 任务入口点

init.c 脚本是服务器执行的第一个东西。它初始化中央经济系统并创建任务实例。

c
void main()
{
    Hive ce = CreateHive();
    if (ce)
        ce.InitOffline();

    GetGame().GetWorld().SetDate(2024, 9, 15, 12, 0);
    CreateCustomMission("dayzOffline.chernarusplus");
}

class CustomMission: MissionServer
{
    override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos,
                                        ParamsReadContext ctx, string characterName)
    {
        Entity playerEnt;
        playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");
        Class.CastTo(m_player, playerEnt);
        GetGame().SelectPlayer(identity, m_player);
        return m_player;
    }

    override void StartingEquipSetup(PlayerBase player, bool clothesChosen)
    {
        EntityAI itemClothing = player.FindAttachmentBySlotName("Body");
        if (itemClothing)
        {
            itemClothing.GetInventory().CreateInInventory("BandageDressing");
        }
    }
}

Mission CreateCustomMission(string path)
{
    return new CustomMission();
}

Hive 管理 CE 数据库。没有 CreateHive(),物品不会生成且持久化被禁用。CreateCharacter 在出生时创建玩家实体,StartingEquipSetup 定义新角色获得的物品。其他有用的 MissionServer 重写包括 OnInit()OnUpdate()InvokeOnConnect()InvokeOnDisconnect()


types.xml --- 物品生成定义

位于 db/types.xml,此文件是 CE 的核心。每个可以生成的物品都必须在这里有条目。

完整条目

xml
<type name="AK74">
    <nominal>6</nominal>
    <lifetime>28800</lifetime>
    <restock>0</restock>
    <min>4</min>
    <quantmin>30</quantmin>
    <quantmax>80</quantmax>
    <cost>100</cost>
    <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1"
           count_in_player="0" crafted="0" deloot="0"/>
    <category name="weapons"/>
    <usage name="Military"/>
    <value name="Tier3"/>
    <value name="Tier4"/>
</type>

字段参考

字段说明
nominal地图上的目标数量。CE 生成物品直到达到此值
minCE 触发补货前的最小数量
lifetime物品在地面上消失前的持续秒数
restock补货尝试之间的最小秒数(0 = 立即)
quantmin/quantmax具有数量的物品的填充百分比(弹匣、瓶子)。没有数量的物品使用 -1
costCE 优先级权重(越高 = 越优先)。大多数物品使用 100

标志

标志用途
count_in_cargo将容器内的物品计入 nominal
count_in_hoarder将藏匿处/帐篷/桶中的物品计入 nominal
count_in_map将地面上的物品计入 nominal
count_in_player将玩家物品栏中的物品计入 nominal
crafted物品仅可制作,不自然生成
deloot动态事件战利品(直升机坠毁等)

类别、用途和值标签

这些标签控制物品在哪里生成:

  • category --- 物品类型。原版:toolscontainersclothesfoodweaponsbooksexplosiveslootdispatch
  • usage --- 建筑类型。原版:MilitaryPoliceMedicFirefighterIndustrialFarmCoastTownVillageHuntingOfficeSchoolPrisonContaminatedAreaHistorical
  • value --- 地图层级区域。原版:Tier1(海岸)、Tier2(内陆)、Tier3(军事)、Tier4(深层军事)、Unique

可以组合多个标签。没有 usage 标签 = 物品不会生成。没有 value 标签 = 在所有层级生成。

禁用物品

设置 nominal=0min=0。物品永不生成但仍可通过脚本或制作存在。


cfgspawnabletypes.xml --- 附件和货物

控制什么物品已经附着在其他物品上或在其内部生成。

储物标记

存储容器被标记以便 CE 知道它们持有玩家物品:

xml
<type name="SeaChest">
    <hoarder />
</type>

生成损伤

xml
<type name="NVGoggles">
    <damage min="0.0" max="0.32" />
</type>

值范围从 0.0(崭新)到 1.0(损毁)。

附件

xml
<type name="PlateCarrierVest_Camo">
    <damage min="0.1" max="0.6" />
    <attachments chance="0.85">
        <item name="PlateCarrierHolster_Camo" chance="1.00" />
    </attachments>
    <attachments chance="0.85">
        <item name="PlateCarrierPouches_Camo" chance="1.00" />
    </attachments>
</type>

外层 chance 决定是否评估附件组。内层 chance 在一个组中列出多个物品时选择特定物品。

货物预设

xml
<type name="AssaultBag_Ttsko">
    <cargo preset="mixArmy" />
    <cargo preset="mixArmy" />
    <cargo preset="mixArmy" />
</type>

每行独立掷骰预设——三行意味着三次独立的机会。


cfgrandompresets.xml --- 可复用战利品池

定义 cfgspawnabletypes.xml 引用的命名物品池:

xml
<randompresets>
    <cargo chance="0.16" name="foodVillage">
        <item name="SodaCan_Cola" chance="0.02" />
        <item name="TunaCan" chance="0.05" />
        <item name="PeachesCan" chance="0.05" />
        <item name="BakedBeansCan" chance="0.05" />
        <item name="Crackers" chance="0.05" />
    </cargo>

    <cargo chance="0.15" name="toolsHermit">
        <item name="WeaponCleaningKit" chance="0.10" />
        <item name="Matchbox" chance="0.15" />
        <item name="Hatchet" chance="0.07" />
    </cargo>
</randompresets>

预设的 chance 是任何东西生成的总体概率。如果掷骰成功,根据各物品的 chance 从池中选择一个物品。要添加 Mod 物品,创建一个新的 cargo 块并在 cfgspawnabletypes.xml 中引用它。


globals.xml --- 经济参数

位于 db/globals.xml,此文件设置全局 CE 参数:

xml
<variables>
    <var name="AnimalMaxCount" type="0" value="200"/>
    <var name="ZombieMaxCount" type="0" value="1000"/>
    <var name="CleanupLifetimeDeadPlayer" type="0" value="3600"/>
    <var name="CleanupLifetimeDeadAnimal" type="0" value="1200"/>
    <var name="CleanupLifetimeDeadInfected" type="0" value="330"/>
    <var name="CleanupLifetimeRuined" type="0" value="330"/>
    <var name="FlagRefreshFrequency" type="0" value="432000"/>
    <var name="FlagRefreshMaxDuration" type="0" value="3456000"/>
    <var name="FoodDecay" type="0" value="1"/>
    <var name="InitialSpawn" type="0" value="100"/>
    <var name="LootDamageMin" type="1" value="0.0"/>
    <var name="LootDamageMax" type="1" value="0.82"/>
    <var name="SpawnInitial" type="0" value="1200"/>
    <var name="TimeLogin" type="0" value="15"/>
    <var name="TimeLogout" type="0" value="15"/>
    <var name="TimePenalty" type="0" value="20"/>
    <var name="TimeHopping" type="0" value="60"/>
    <var name="ZoneSpawnDist" type="0" value="300"/>
</variables>

关键变量

变量默认值说明
AnimalMaxCount200地图上最大动物数量
ZombieMaxCount1000地图上最大感染者数量
CleanupLifetimeDeadPlayer3600死亡尸体移除时间(秒)
CleanupLifetimeRuined330损毁物品移除时间
FlagRefreshFrequency432000领地旗帜刷新间隔(5 天)
FlagRefreshMaxDuration3456000旗帜最大生存时间(40 天)
FoodDecay1食物腐烂开关(0=关闭,1=开启)
InitialSpawn100启动时生成 nominal 的百分比
LootDamageMax0.82生成战利品的最大损伤
TimeLogin / TimeLogout15登录/登出计时器(防战斗退出)
TimePenalty20战斗退出惩罚计时器
ZoneSpawnDist300触发僵尸/动物生成的玩家距离

type 属性中 0 表示整数,1 表示浮点数。使用错误的类型会截断值。


cfggameplay.json --- 游戏设置

仅当 serverDZ.cfg 中设置了 enableCfgGameplayFile = 1 时才加载。否则引擎使用硬编码的默认值。

结构

json
{
    "version": 123,
    "GeneralData": {
        "disableBaseDamage": false,
        "disableContainerDamage": false,
        "disableRespawnDialog": false
    },
    "PlayerData": {
        "disablePersonalLight": false,
        "StaminaData": {
            "sprintStaminaModifierErc": 1.0,
            "staminaMax": 100.0,
            "staminaWeightLimitThreshold": 6000.0,
            "staminaMinCap": 5.0
        },
        "MovementData": {
            "timeToSprint": 0.45,
            "rotationSpeedSprint": 0.15,
            "allowStaminaAffectInertia": true
        }
    },
    "WorldsData": {
        "lightingConfig": 0,
        "environmentMinTemps": [-3, -2, 0, 4, 9, 14, 18, 17, 13, 11, 9, 0],
        "environmentMaxTemps": [3, 5, 7, 14, 19, 24, 26, 25, 18, 14, 10, 5]
    },
    "BaseBuildingData": {
        "HologramData": {
            "disableIsCollidingBBoxCheck": false,
            "disableIsCollidingAngleCheck": false,
            "disableHeightPlacementCheck": false,
            "disallowedTypesInUnderground": ["FenceKit", "TerritoryFlagKit"]
        }
    },
    "MapData": {
        "ignoreMapOwnership": false,
        "displayPlayerPosition": false,
        "displayNavInfo": true
    }
}

关键设置:disableBaseDamage 防止基地损伤,disablePersonalLight 移除新角色的光源,staminaWeightLimitThreshold 以克为单位(6000 = 6kg),温度数组有 12 个值(一月至十二月),lightingConfig 接受 0(默认)或 1(更暗的夜晚),displayPlayerPosition 在地图上显示玩家的点。


serverDZ.cfg --- 服务器设置

此文件位于服务器可执行文件旁边,不在任务文件夹中。

关键设置

hostname = "My DayZ Server";
password = "";
passwordAdmin = "adminpass123";
maxPlayers = 60;
verifySignatures = 2;
forceSameBuild = 1;
template = "dayzOffline.chernarusplus";
enableCfgGameplayFile = 1;
storeHouseStateDisabled = false;
storageAutoFix = 1;
参数说明
hostname浏览器中的服务器名称
password加入密码(空 = 开放)
passwordAdminRCON 管理员密码
maxPlayers最大同时在线玩家数
template任务文件夹名称
verifySignatures签名检查级别(2 = 严格)
enableCfgGameplayFile加载 cfggameplay.json(0/1)

Mod 加载

Mod 通过启动参数指定,不在配置文件中:

DayZServer_x64.exe -config=serverDZ.cfg -mod=@CF;@MyMod -servermod=@MyServerMod -port=2302

-mod= Mod 必须由客户端安装。-servermod= Mod 仅在服务器端运行。


Mod 如何与经济系统交互

cfgeconomycore.xml --- 根类注册

每个物品类层次结构都必须追溯到已注册的根类:

xml
<economycore>
    <classes>
        <rootclass name="DefaultWeapon" />
        <rootclass name="DefaultMagazine" />
        <rootclass name="Inventory_Base" />
        <rootclass name="SurvivorBase" act="character" reportMemoryLOD="no" />
        <rootclass name="DZ_LightAI" act="character" reportMemoryLOD="no" />
        <rootclass name="CarScript" act="car" reportMemoryLOD="no" />
    </classes>
</economycore>

如果你的 Mod 引入了不继承自 Inventory_BaseDefaultWeaponDefaultMagazine 的新基类,将其添加为 rootclassact 属性指定实体类型:character 用于 AI,car 用于载具。

cfglimitsdefinition.xml --- 自定义标签

任何在 types.xml 中使用的 categoryusagevalue 必须在这里定义:

xml
<lists>
    <categories>
        <category name="mymod_special"/>
    </categories>
    <usageflags>
        <usage name="MyModDungeon"/>
    </usageflags>
    <valueflags>
        <value name="MyModEndgame"/>
    </valueflags>
</lists>

使用 cfglimitsdefinitionuser.xml 添加不应覆盖原版文件的内容。

economy.xml --- 子系统控制

控制哪些 CE 子系统处于活动状态:

xml
<economy>
    <dynamic init="1" load="1" respawn="1" save="1"/>
    <animals init="1" load="0" respawn="1" save="0"/>
    <zombies init="1" load="0" respawn="1" save="0"/>
    <vehicles init="1" load="1" respawn="1" save="1"/>
</economy>

标志:init(启动时生成)、load(加载持久化数据)、respawn(清理后重新生成)、save(持久化到数据库)。

脚本端经济交互

通过 CreateInInventory() 创建的物品自动由 CE 管理。对于世界生成,使用 ECE 标志:

c
EntityAI item = GetGame().CreateObjectEx("AK74", position, ECE_PLACE_ON_SURFACE);

常见错误

XML 语法错误

一个未关闭的标签会破坏整个文件。部署前始终验证 XML。

cfglimitsdefinition.xml 中缺少标签

在 types.xml 中使用未在 cfglimitsdefinition.xml 中定义的 usagevalue 会导致物品静默地无法生成。检查 RPT 日志中的警告。

Nominal 过高

所有物品的总 nominal 应保持在 10,000-15,000 以下。过高的值会降低服务器性能。

Lifetime 过短

生存时间非常短的物品会在玩家找到之前消失。常见物品至少使用 3600(1 小时),武器使用 28800(8 小时)。

缺少根类

类层次结构未追溯到 cfgeconomycore.xml 中已注册根类的物品将永远不会生成,即使 types.xml 条目正确也是如此。

cfggameplay.json 未启用

除非在 serverDZ.cfg 中设置 enableCfgGameplayFile = 1,否则该文件会被忽略。

globals.xml 中类型错误

对浮点值(如 0.82)使用 type="0"(整数)会将其截断为 0。浮点数使用 type="1"

直接编辑原版文件

修改原版 types.xml 可以工作但在游戏更新时会破坏。优先发布单独的类型文件并通过 cfgeconomycore 注册它们,或使用 cfglimitsdefinitionuser.xml 添加自定义标签。


最佳实践

  • 随你的 Mod 发布一个 ServerFiles/ 文件夹,包含预配置的 types.xml 条目,以便服务器管理员可以复制粘贴而不是从头编写。
  • 使用 cfglimitsdefinitionuser.xml 而不是编辑原版 cfglimitsdefinition.xml——你的添加在游戏更新后依然存在。
  • 对常见物品(食物、弹药)设置 count_in_hoarder="0" 以防止囤积阻塞 CE 重新生成。
  • 在期望 cfggameplay.json 更改生效之前,始终在 serverDZ.cfg 中设置 enableCfgGameplayFile = 1
  • 保持所有 types.xml 条目的总 nominal 低于 12,000,以避免在人口众多的服务器上出现 CE 性能下降。

理论与实践

概念理论现实
nominal 是硬目标CE 精确生成这么多物品CE 随时间接近 nominal 但根据玩家交互、清理周期和区域距离而波动
restock=0 意味着立即重新生成物品在消失后立即重新出现CE 以周期方式批量处理补货(通常每 30-60 秒),因此无论 restock 值如何,总有延迟
cfggameplay.json 控制所有游戏玩法所有调整都在这里许多游戏值硬编码在脚本或 config.cpp 中,不能被 cfggameplay.json 覆盖
init.c 仅在服务器启动时运行一次性初始化init.c 在每次任务加载时运行,包括服务器重启后。持久状态由 Hive 管理,而不是 init.c
多个 types.xml 文件可以干净合并CE 读取所有已注册的文件文件必须通过 <ce folder="custom"> 指令在 cfgeconomycore.xml 中注册。仅将额外的 XML 文件放在 db/ 中不起作用

兼容性与影响

  • 多 Mod 共存: 多个 Mod 可以向 types.xml 添加条目而不冲突,只要类名唯一。如果两个 Mod 定义了具有不同 nominal/lifetime 值的相同类名,最后加载的条目获胜。
  • 性能: 过高的 nominal 计数(15,000+)导致 CE 周期峰值,表现为服务器 FPS 下降。每个 CE 周期遍历所有已注册的类型以检查生成条件。

Released under CC BY-SA 4.0 | Code examples under MIT License