From d61cb86d3aa59f0a4591c786120c8a2bcb72ea5a Mon Sep 17 00:00:00 2001 From: Jacob Schmidt Date: Wed, 3 Jun 2026 17:47:02 -0500 Subject: [PATCH] Move service pricing into economy config --- .../actor/functions/fnc_handleUIEvents.sqf | 5 ++--- .../actor/functions/fnc_initRepository.sqf | 5 ++--- .../functions/fnc_initRepository.sqf | 3 ++- arma/server/addons/economy/CfgServicePricing.hpp | 16 ++++++++++++++++ arma/server/addons/economy/README.md | 2 +- arma/server/addons/economy/config.cpp | 1 + .../economy/functions/fnc_initFEconomyStore.sqf | 5 ++--- .../economy/functions/fnc_initMEconomyStore.sqf | 5 ++--- .../economy/functions/fnc_initSEconomyStore.sqf | 5 ++--- arma/server/addons/task/CfgMissions.hpp | 15 --------------- .../functions/fnc_initMissionSetupService.sqf | 9 ++++++++- .../functions/fnc_initTransportService.sqf | 5 ++--- docs/ECONOMY_USAGE_GUIDE.md | 4 ++-- docs/MISSION_DESIGNER_GUIDE.md | 2 +- docs/TASK_USAGE_GUIDE.md | 2 +- docs/TRANSPORT_SERVICE_GUIDE.md | 2 +- 16 files changed, 45 insertions(+), 41 deletions(-) create mode 100644 arma/server/addons/economy/CfgServicePricing.hpp diff --git a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf index e79305e..e5adeeb 100644 --- a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf +++ b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf @@ -83,9 +83,8 @@ switch (_event) do { params [["_name", "", [""]], ["_default", 0, [0]]]; private _configDefault = _default; - private _missionConfig = missionConfigFile >> "CfgMissions"; - if !(isClass _missionConfig) then { _missionConfig = configFile >> "CfgMissions"; }; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _serviceConfig) then { _serviceConfig = configFile >> "CfgServicePricing"; }; if (isNumber (_serviceConfig >> _name)) then { _configDefault = getNumber (_serviceConfig >> _name); }; diff --git a/arma/client/addons/actor/functions/fnc_initRepository.sqf b/arma/client/addons/actor/functions/fnc_initRepository.sqf index 535ea06..de88ebf 100644 --- a/arma/client/addons/actor/functions/fnc_initRepository.sqf +++ b/arma/client/addons/actor/functions/fnc_initRepository.sqf @@ -146,9 +146,8 @@ GVAR(ActorRepositoryBaseClass) = compileFinal createHashMapFromArray [ params [["_name", "", [""]], ["_default", 0, [0]]]; private _configDefault = _default; - private _missionConfig = missionConfigFile >> "CfgMissions"; - if !(isClass _missionConfig) then { _missionConfig = configFile >> "CfgMissions"; }; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _serviceConfig) then { _serviceConfig = configFile >> "CfgServicePricing"; }; if (isNumber (_serviceConfig >> _name)) then { _configDefault = getNumber (_serviceConfig >> _name); }; diff --git a/arma/client/addons/mission_setup/functions/fnc_initRepository.sqf b/arma/client/addons/mission_setup/functions/fnc_initRepository.sqf index 3af8bb9..0b2f9c4 100644 --- a/arma/client/addons/mission_setup/functions/fnc_initRepository.sqf +++ b/arma/client/addons/mission_setup/functions/fnc_initRepository.sqf @@ -159,7 +159,8 @@ GVAR(MissionSetupRepositoryBaseClass) = compileFinal createHashMapFromArray [ private _serviceDefault = { params ["_varName", "_default"]; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _serviceConfig) then { _serviceConfig = configFile >> "CfgServicePricing"; }; if (isNumber (_serviceConfig >> _varName)) exitWith { getNumber (_serviceConfig >> _varName) }; diff --git a/arma/server/addons/economy/CfgServicePricing.hpp b/arma/server/addons/economy/CfgServicePricing.hpp new file mode 100644 index 0000000..ffda395 --- /dev/null +++ b/arma/server/addons/economy/CfgServicePricing.hpp @@ -0,0 +1,16 @@ +/* + * Framework fallback prices for service/economy interactions. + * + * Mission-local CfgServicePricing overrides this config. Mission Params with + * matching names override config defaults before the setup UI opens, and + * submitted setup UI values override both. + */ +class CfgServicePricing { + medicalSpawnCost = 100; + medicalHealCost = 100; + serviceRepairCost = 500; + serviceRearmCost = 500; + fuelCost = 5; + transportBaseFare = 100; + transportPricePerKm = 50; +}; diff --git a/arma/server/addons/economy/README.md b/arma/server/addons/economy/README.md index 3736f39..870ca59 100644 --- a/arma/server/addons/economy/README.md +++ b/arma/server/addons/economy/README.md @@ -13,7 +13,7 @@ charges such as repairs and rearming. Service prices are read dynamically from mission namespace values so the framework mission setup UI can override them at startup. If the UI is cancelled or unavailable, mission `Params` with matching names are used as the backup; -if no param is defined, `CfgMissions >> ServicePricing` provides the fallback. +if no param is defined, `CfgServicePricing` provides the fallback. Supported setting names: - `medicalSpawnCost` - best-effort medical respawn charge; default `100` diff --git a/arma/server/addons/economy/config.cpp b/arma/server/addons/economy/config.cpp index cbd0a75..6c561df 100644 --- a/arma/server/addons/economy/config.cpp +++ b/arma/server/addons/economy/config.cpp @@ -18,3 +18,4 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "CfgServicePricing.hpp" diff --git a/arma/server/addons/economy/functions/fnc_initFEconomyStore.sqf b/arma/server/addons/economy/functions/fnc_initFEconomyStore.sqf index 27bed70..1d74a7f 100644 --- a/arma/server/addons/economy/functions/fnc_initFEconomyStore.sqf +++ b/arma/server/addons/economy/functions/fnc_initFEconomyStore.sqf @@ -36,9 +36,8 @@ GVAR(FEconomyStore) = createHashMapObject [[ params [["_name", "", [""]], ["_default", 0, [0]]]; private _configDefault = _default; - private _missionConfig = missionConfigFile >> "CfgMissions"; - if !(isClass _missionConfig) then { _missionConfig = configFile >> "CfgMissions"; }; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _serviceConfig) then { _serviceConfig = configFile >> "CfgServicePricing"; }; if (isNumber (_serviceConfig >> _name)) then { _configDefault = getNumber (_serviceConfig >> _name); }; diff --git a/arma/server/addons/economy/functions/fnc_initMEconomyStore.sqf b/arma/server/addons/economy/functions/fnc_initMEconomyStore.sqf index bf0f97b..4a0222d 100644 --- a/arma/server/addons/economy/functions/fnc_initMEconomyStore.sqf +++ b/arma/server/addons/economy/functions/fnc_initMEconomyStore.sqf @@ -37,9 +37,8 @@ GVAR(MEconomyStore) = createHashMapObject [[ params [["_name", "", [""]], ["_default", 0, [0]]]; private _configDefault = _default; - private _missionConfig = missionConfigFile >> "CfgMissions"; - if !(isClass _missionConfig) then { _missionConfig = configFile >> "CfgMissions"; }; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _serviceConfig) then { _serviceConfig = configFile >> "CfgServicePricing"; }; if (isNumber (_serviceConfig >> _name)) then { _configDefault = getNumber (_serviceConfig >> _name); }; diff --git a/arma/server/addons/economy/functions/fnc_initSEconomyStore.sqf b/arma/server/addons/economy/functions/fnc_initSEconomyStore.sqf index c99d4d5..cbe9bbb 100644 --- a/arma/server/addons/economy/functions/fnc_initSEconomyStore.sqf +++ b/arma/server/addons/economy/functions/fnc_initSEconomyStore.sqf @@ -34,9 +34,8 @@ GVAR(SEconomyStore) = createHashMapObject [[ params [["_name", "", [""]], ["_default", 0, [0]]]; private _configDefault = _default; - private _missionConfig = missionConfigFile >> "CfgMissions"; - if !(isClass _missionConfig) then { _missionConfig = configFile >> "CfgMissions"; }; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _serviceConfig) then { _serviceConfig = configFile >> "CfgServicePricing"; }; if (isNumber (_serviceConfig >> _name)) then { _configDefault = getNumber (_serviceConfig >> _name); }; diff --git a/arma/server/addons/task/CfgMissions.hpp b/arma/server/addons/task/CfgMissions.hpp index f470909..ae42080 100644 --- a/arma/server/addons/task/CfgMissions.hpp +++ b/arma/server/addons/task/CfgMissions.hpp @@ -12,9 +12,6 @@ * Generator behavior: * - maxConcurrentMissions and missionInterval are copied into * forge_server_task_missionSetup_settings by the framework mission setup service. - * - ServicePricing values are copied to missionNamespace by the framework - * mission setup service so economy and transport stores can read UI or - * mission-param overrides at runtime. * - Reward, reputation, penalty, and timeLimit ranges are read through * forge_server_task_fnc_getMissionSettingRange so UI overrides and config fallbacks * use the same path. @@ -29,18 +26,6 @@ class CfgMissions { // Seconds before a generated mission location can be reused. locationReuseCooldown = 900; - // Economy and service defaults. Mission Params with matching names override - // these values before the setup UI opens; submitted UI values override both. - class ServicePricing { - medicalSpawnCost = 100; - medicalHealCost = 100; - serviceRepairCost = 500; - serviceRearmCost = 500; - fuelCost = 5; - transportBaseFare = 100; - transportPricePerKm = 50; - }; - // Enemy faction selection is ultimately exported to ENEMY_FACTION_STR and // ENEMY_SIDE for server-side generators. class EnemyFactionConfig { diff --git a/arma/server/addons/task/functions/fnc_initMissionSetupService.sqf b/arma/server/addons/task/functions/fnc_initMissionSetupService.sqf index 068c040..4bd1707 100644 --- a/arma/server/addons/task/functions/fnc_initMissionSetupService.sqf +++ b/arma/server/addons/task/functions/fnc_initMissionSetupService.sqf @@ -23,6 +23,13 @@ GVAR(MissionSetupServiceBaseClass) = compileFinal createHashMapFromArray [ }; _missionConfig }], + ["getServicePricingConfig", compileFinal { + private _pricingConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _pricingConfig) then { + _pricingConfig = configFile >> "CfgServicePricing"; + }; + _pricingConfig + }], ["numberOrDefault", compileFinal { params ["_value", "_default"]; @@ -86,7 +93,7 @@ GVAR(MissionSetupServiceBaseClass) = compileFinal createHashMapFromArray [ private _serviceDefault = { params ["_varName", "_default"]; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = _self call ["getServicePricingConfig", []]; if (isNumber (_serviceConfig >> _varName)) exitWith { getNumber (_serviceConfig >> _varName) }; diff --git a/arma/server/addons/transport/functions/fnc_initTransportService.sqf b/arma/server/addons/transport/functions/fnc_initTransportService.sqf index ff3e36a..96751e8 100644 --- a/arma/server/addons/transport/functions/fnc_initTransportService.sqf +++ b/arma/server/addons/transport/functions/fnc_initTransportService.sqf @@ -43,9 +43,8 @@ GVAR(TransportServiceBase) = compileFinal createHashMapFromArray [ params [["_name", "", [""]], ["_default", 0, [0]]]; private _configDefault = _default; - private _missionConfig = missionConfigFile >> "CfgMissions"; - if !(isClass _missionConfig) then { _missionConfig = configFile >> "CfgMissions"; }; - private _serviceConfig = _missionConfig >> "ServicePricing"; + private _serviceConfig = missionConfigFile >> "CfgServicePricing"; + if !(isClass _serviceConfig) then { _serviceConfig = configFile >> "CfgServicePricing"; }; if (isNumber (_serviceConfig >> _name)) then { _configDefault = getNumber (_serviceConfig >> _name); }; diff --git a/docs/ECONOMY_USAGE_GUIDE.md b/docs/ECONOMY_USAGE_GUIDE.md index 35226b0..e415be5 100644 --- a/docs/ECONOMY_USAGE_GUIDE.md +++ b/docs/ECONOMY_USAGE_GUIDE.md @@ -31,7 +31,7 @@ succeeds. The refuel price per liter is controlled by `fuelCost`. The mission setup UI can override it at startup; otherwise a mission `Params` entry named -`fuelCost` or `CfgMissions >> ServicePricing >> fuelCost` is used. +`fuelCost` or `CfgServicePricing >> fuelCost` is used. ## Repair @@ -96,7 +96,7 @@ Medical pricing uses: best-effort so a failed charge does not block the respawn flow. Both values can be set in the mission setup UI, mission `Params`, or -`CfgMissions >> ServicePricing`. +`CfgServicePricing`. ## Medical Debt Repayment diff --git a/docs/MISSION_DESIGNER_GUIDE.md b/docs/MISSION_DESIGNER_GUIDE.md index f2caa5d..da5ea4f 100644 --- a/docs/MISSION_DESIGNER_GUIDE.md +++ b/docs/MISSION_DESIGNER_GUIDE.md @@ -764,7 +764,7 @@ applies settings. Cancel, X, and Escape apply default values from CBA, mission parameters, and `CfgMissions`. There is no timeout that auto-applies defaults. After settings are applied, the setup UI cannot be reopened. -Service pricing fallback values live under `CfgMissions >> ServicePricing`. +Service pricing fallback values live in mission-local `CfgServicePricing.hpp`. Mission `Params` with matching names, such as `medicalHealCost`, `serviceRepairCost`, `serviceRearmCost`, `fuelCost`, `transportBaseFare`, and `transportPricePerKm`, are read before the setup UI hydrates so mission makers diff --git a/docs/TASK_USAGE_GUIDE.md b/docs/TASK_USAGE_GUIDE.md index cff8546..eebe87c 100644 --- a/docs/TASK_USAGE_GUIDE.md +++ b/docs/TASK_USAGE_GUIDE.md @@ -196,7 +196,7 @@ waits for setup settings before starting. There is no timeout auto-apply. Pressing Cancel, X, or Escape applies default values from CBA, mission parameters, and `CfgMissions`. -Service price defaults are stored in `CfgMissions >> ServicePricing`. Mission +Service price defaults are stored in `CfgServicePricing`. Mission `Params` with matching names override those defaults before the UI opens, and submitted UI values override both. The supported names are `medicalSpawnCost`, `medicalHealCost`, `serviceRepairCost`, diff --git a/docs/TRANSPORT_SERVICE_GUIDE.md b/docs/TRANSPORT_SERVICE_GUIDE.md index 860b4b0..5708e8b 100644 --- a/docs/TRANSPORT_SERVICE_GUIDE.md +++ b/docs/TRANSPORT_SERVICE_GUIDE.md @@ -93,7 +93,7 @@ dressing object that should not be moved as cargo. Default transport pricing comes from the mission setup UI or matching mission `Params` entries named `transportBaseFare` and `transportPricePerKm`. If neither -is set, `CfgMissions >> ServicePricing` provides the fallback. +is set, `CfgServicePricing` provides the fallback. ## Optional Per-Node Overrides