ACE3/addons/repair/CfgVehicles.hpp
Dystopian 96f81f1c9b
Interaction - Add actions based on animations (#6144)
* Add actions based on animations

* Add setting

* Add ability to set items for users

* Add actions for 1.82 changes

Add actions for backpacks, canisters, entrench tool.
Move items and backpack to WeaponHolder.

* Add RHS 0.4.6 ZIL spare

* Update to new standards

* Handle RHS BTR retread system

* Make init faster: move condition to configClasses

* Fix CUP fake anims

* Refactor

* Rework

* Rename init function

* Decrease number of classes to init

* Fix merge mistake

* Apply suggestions from code review

* Updated code for current mod structure

* Multiple fixes & tweaks

- Made anim setting require a mission restart
- Handle more types of items that can be spawned
- Prioritise adding items to inventory and only drop on ground if no inventory space
- Add more position checks to make certain no valid position are present before stopping
- If 1 item was spawned in, it's considered as success
- Disable RHS' wheel replacement only if ace_repair is loaded

* Update CfgVehicles.hpp

* cache config lookup at preStart

* Fix error

* Add text config entry for progress bar title

* Restructure interactions, improved some locations & added interaction to some missing vehicles

* Reverted preInit change

---------

Co-authored-by: jonpas <jonpas33@gmail.com>
Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com>
Co-authored-by: PabstMirror <pabstmirror@gmail.com>
2024-08-10 23:29:50 -05:00

516 lines
18 KiB
C++

#define MACRO_REPAIRVEHICLE \
class ACE_Actions { \
class ACE_MainActions { \
class GVAR(Repair) { \
displayName = CSTRING(Repair); \
icon = "\A3\ui_f\data\igui\cfg\actions\repair_ca.paa"; \
distance = 4; \
exceptions[] = {"isNotSwimming", "isNotOnLadder"}; \
}; \
}; \
};
class CBA_Extended_EventHandlers_base;
class CfgVehicles {
class ACE_Module;
class ACE_moduleRepairSettings: ACE_Module {
scope = 1;
displayName = CSTRING(moduleName);
icon = QPATHTOF(ui\Icon_Module_Repair_ca.paa);
category = "ACE_Logistics";
function = QFUNC(moduleRepairSettings);
functionPriority = 1;
isGlobal = 1;
isSingular = 1;
isTriggerActivated = 0;
author = ECSTRING(Common,ACETeam);
class Arguments {
class engineerSetting_Repair {
displayName = CSTRING(engineerSetting_Repair_name);
description = CSTRING(engineerSetting_Repair_description);
typeName = "NUMBER";
class values {
class anyone { name = CSTRING(engineerSetting_anyone); value = 0; };
class Engineer { name = CSTRING(engineerSetting_EngineerOnly); value = 1; default = 1; };
class Advanced { name = CSTRING(engineerSetting_AdvancedOnly); value = 2; };
};
};
class engineerSetting_Wheel {
displayName = CSTRING(engineerSetting_Wheel_name);
description = CSTRING(engineerSetting_Wheel_description);
typeName = "NUMBER";
class values {
class anyone { name = CSTRING(engineerSetting_anyone); value = 0; default = 1; };
class Engineer { name = CSTRING(engineerSetting_EngineerOnly); value = 1; };
class Advanced { name = CSTRING(engineerSetting_AdvancedOnly); value = 2; };
};
};
class repairDamageThreshold {
displayName = CSTRING(repairDamageThreshold_name);
description = CSTRING(repairDamageThreshold_description);
typeName = "NUMBER";
defaultValue = 0.6;
};
class repairDamageThreshold_Engineer {
displayName = CSTRING(repairDamageThreshold_Engineer_name);
description = CSTRING(repairDamageThreshold_Engineer_description);
typeName = "NUMBER";
defaultValue = 0.4;
};
class consumeItem_ToolKit {
displayName = CSTRING(consumeItem_ToolKit_name);
description = CSTRING(consumeItem_ToolKit_description);
typeName = "NUMBER";
class values {
class keep { name = ECSTRING(common,No); value = 0; default = 1; };
class remove { name = ECSTRING(common,Yes); value = 1; };
};
};
class fullRepairLocation {
displayName = CSTRING(fullRepairLocation);
description = CSTRING(fullRepairLocation_description);
typeName = "NUMBER";
class values {
class anywhere { name = CSTRING(useAnywhere); value = 0; };
class vehicle { name = CSTRING(repairVehicleOnly); value = 1; };
class facility { name = CSTRING(repairFacilityOnly); value = 2; default = 1; };
class vehicleAndFacility { name = CSTRING(vehicleAndFacility); value = 3; };
class disabled { name = ECSTRING(common,Disabled); value = 4;};
};
};
class engineerSetting_fullRepair {
displayName = CSTRING(engineerSetting_fullRepair_name);
description = CSTRING(engineerSetting_fullRepair_description);
typeName = "NUMBER";
class values {
class anyone { name = CSTRING(engineerSetting_anyone); value = 0; };
class Engineer { name = CSTRING(engineerSetting_EngineerOnly); value = 1; };
class Advanced { name = CSTRING(engineerSetting_AdvancedOnly); value = 2; default = 1;};
};
};
class addSpareParts {
displayName = CSTRING(addSpareParts_name);
description = CSTRING(addSpareParts_description);
typeName = "BOOL";
defaultValue = 1;
};
class wheelRepairRequiredItems {
displayName = CSTRING(WheelRepairRequiredItems_DisplayName);
description = CSTRING(wheelRepairRequiredItems_description);
typeName = "NUMBER";
class values {
class None { name = "None"; value = 0; default = 1;};
class ToolKit { name = "ToolKit"; value = 1; };
};
};
};
class ModuleDescription {
description = CSTRING(moduleDescription);
sync[] = {};
};
};
class Module_F;
class ACE_moduleAssignEngineerRoles: Module_F {
scope = 1;
displayName = CSTRING(AssignEngineerRole_Module_DisplayName);
icon = QPATHTOF(ui\Icon_Module_Repair_ca.paa);
category = "ACE_Logistics";
function = QFUNC(moduleAssignEngineer);
functionPriority = 10;
isGlobal = 2;
isTriggerActivated = 0;
isDisposable = 0;
author = ECSTRING(common,ACETeam);
class Arguments {
class EnableList {
displayName = CSTRING(EnableList_DisplayName);
description = CSTRING(AssignEngineerRole_EnableList_Description);
defaultValue = "";
typeName = "STRING";
};
class role {
displayName = CSTRING(AssignEngineerRole_role_DisplayName);
description = CSTRING(AssignEngineerRole_role_Description);
typeName = "NUMBER";
class values {
class none {
name = CSTRING(AssignEngineerRole_role_none);
value = 0;
};
class medic {
name = CSTRING(AssignEngineerRole_role_engineer);
value = 1;
default = 1;
};
class doctor {
name = CSTRING(AssignEngineerRole_role_advanced);
value = 2;
};
};
};
};
class ModuleDescription {
description = CSTRING(AssignEngineerRole_Module_Description);
sync[] = {};
};
};
class ACE_moduleAssignRepairVehicle: Module_F {
scope = 1;
displayName = CSTRING(AssignRepairVehicle_Module_DisplayName);
icon = QPATHTOF(ui\Icon_Module_Repair_ca.paa);
category = "ACE_Logistics";
function = QFUNC(moduleAssignRepairVehicle);
functionPriority = 10;
isGlobal = 2;
isTriggerActivated = 0;
isDisposable = 0;
author = ECSTRING(common,ACETeam);
class Arguments {
class EnableList {
displayName = CSTRING(EnableList_DisplayName);
description = CSTRING(AssignRepairVehicle_EnableList_Description);
defaultValue = "";
typeName = "STRING";
};
class role {
displayName = CSTRING(AssignRepairVehicle_role_DisplayName);
description = CSTRING(AssignRepairVehicle_role_Description);
typeName = "NUMBER";
class values {
class none {
name = ECSTRING(common,No);
value = 0;
};
class isVehicle {
name = ECSTRING(common,Yes);
value = 1;
default = 1;
};
};
};
};
class ModuleDescription {
description = CSTRING(AssignRepairVehicle_Module_Description);
sync[] = {};
};
};
class ACE_moduleAssignRepairFacility: ACE_moduleAssignRepairVehicle {
displayName = CSTRING(AssignRepairFacility_Module_DisplayName);
function = QFUNC(moduleAssignRepairFacility);
class Arguments {
class EnableList {
displayName = CSTRING(EnableList_DisplayName);
description = CSTRING(AssignRepairFacility_EnableList_Description);
defaultValue = "";
typeName = "STRING";
};
class role {
displayName = CSTRING(AssignRepairFacility_role_DisplayName);
description = CSTRING(AssignRepairFacility_role_Description);
typeName = "NUMBER";
class values {
class none {
name = ECSTRING(common,No);
value = 0;
};
class isFacility {
name = ECSTRING(common,Yes);
value = 1;
default = 1;
};
};
};
};
class ModuleDescription {
description = CSTRING(AssignRepairFacility_Module_Description);
sync[] = {};
};
};
class ACE_moduleAddSpareParts: Module_F {
scope = 1;
displayName = CSTRING(AddSpareParts_Module_DisplayName);
icon = QPATHTOF(ui\Icon_Module_Repair_ca.paa);
category = "ACE_Logistics";
function = QFUNC(moduleAddSpareParts);
functionPriority = 10;
isGlobal = 0;
isTriggerActivated = 0;
isDisposable = 0;
author = ECSTRING(common,ACETeam);
class Arguments {
class List {
displayName = CSTRING(EnableList_DisplayName);
description = CSTRING(AddSpareParts_List_Description);
defaultValue = "";
typeName = "STRING";
};
class Part {
displayName = CSTRING(AddSpareParts_Part_DisplayName);
description = CSTRING(AddSpareParts_Part_Description);
typeName = "STRING";
class values {
class Wheel {
name = CSTRING(SpareWheel);
value = "ACE_Wheel";
default = 1;
};
class Track {
name = CSTRING(SpareTrack);
value = "ACE_Track";
};
};
};
class Amount {
displayName = CSTRING(AddSpareParts_Amount_DisplayName);
description = CSTRING(AddSpareParts_Amount_Description);
typeName = "NUMBER";
defaultValue = 1;
};
};
class ModuleDescription {
description = CSTRING(AddSpareParts_Module_Description);
sync[] = {};
};
};
class LandVehicle;
class Car: LandVehicle {
MACRO_REPAIRVEHICLE
};
class Tank: LandVehicle {
MACRO_REPAIRVEHICLE
};
class Motorcycle: LandVehicle {
MACRO_REPAIRVEHICLE
};
class Air;
class Helicopter: Air {
MACRO_REPAIRVEHICLE
};
class Plane: Air {
MACRO_REPAIRVEHICLE
};
class Ship;
class Ship_F: Ship {
MACRO_REPAIRVEHICLE
};
class ThingX;
class ACE_RepairItem_Base: ThingX {
class EventHandlers {
class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers_base {};
};
class ACE_Actions {
class ACE_MainActions {
modifierFunction = QUOTE(_this call FUNC(modifyInteraction));
};
};
accuracy = 0.2;
vehicleClass = "ACE_Logistics_Items";
editorCategory = "EdCat_Supplies";
editorSubcategory = QEGVAR(main,subcategory);
};
class ACE_Track: ACE_RepairItem_Base {
EGVAR(cargo,size) = 2;
EGVAR(cargo,canLoad) = 1;
EGVAR(cargo,noRename) = 1;
author = "Hawkins";
scope = 2;
model = QPATHTOF(data\ace_track.p3d);
displayName = CSTRING(SpareTrack);
icon = "iconObject_2x1";
mapSize = 0.5;
// damage handling
armor = 1000;
armorStructural = 1;
minTotalDamageThreshold = 0.01;
explosionShielding = 1;
replaceDamagedLimit = 0.9;
selectionDamage = "mat_track";
class Damage {
tex[] = {};
mat[] = {
QPATHTO_R(data\trailObjects_steel.rvmat),
QPATHTO_R(data\trailObjects_steel_damage.rvmat),
QPATHTO_R(data\trailObjects_steel_destruct.rvmat)
};
};
editorPreview = QPATHTOF(data\preview_track.jpg);
};
class ACE_Wheel: ACE_RepairItem_Base {
EGVAR(cargo,size) = 1;
EGVAR(cargo,canLoad) = 1;
EGVAR(cargo,noRename) = 1;
author = "Hawkins";
scope = 2;
model = QPATHTOF(data\ace_wheel.p3d);
displayName = CSTRING(SpareWheel);
picture = QPATHTOF(ui\tire_ca.paa);
icon = "iconObject_circle";
mapSize = 0.7;
// damage handling
armor = 120;
armorStructural = 1;
minTotalDamageThreshold = 0.01;
explosionShielding = 1;
replaceDamagedLimit = 0.9;
selectionDamage = "mat_tyre"; //"mat_rim"
// necessary because only one "selectionDamage" (== "visual") is allowed for simple damage objects
// can not take damage individually though, because of limitations of the thingX simulation type
class HitPoints {
class HitBody {
armor = 1;
material = -1;
name = "mat_rim";
visual = "mat_rim";
passThrough = 1;
radius = 0.1;
explosionShielding = 1;
minimalHit = 1;
};
};
class Damage {
tex[] = {};
mat[] = {
QPATHTO_R(data\trailObjects_tyre.rvmat),
QPATHTO_R(data\trailObjects_tyre_damage.rvmat),
QPATHTO_R(data\trailObjects_tyre_damage.rvmat),
QPATHTO_R(data\trailObjects_steel.rvmat),
QPATHTO_R(data\trailObjects_steel_damage.rvmat),
QPATHTO_R(data\trailObjects_steel_destruct.rvmat)
};
};
editorPreview = QPATHTOF(data\preview_wheel.jpg);
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
class GVAR(Patch) {
displayName = CSTRING(PatchWheel);
distance = 4;
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canPatchRemovedWheel));
statement = QUOTE([ARR_2(_player,_target)] call FUNC(patchRemovedWheel));
exceptions[] = {"isNotDragging", "isNotCarrying", "isNotOnLadder", "isNotSwimming", "isNotSitting"};
icon = QPATHTOF(ui\patch_ca.paa);
};
};
};
};
class Heli_Transport_02_base_F;
class I_Heli_Transport_02_F: Heli_Transport_02_base_F {
GVAR(hitpointPositions)[] = {{"HitVRotor", {-1,-9.4,1.8}}, {"HitHRotor", {0,1.8,1.3}}};
};
class Helicopter_Base_F;
class Heli_light_03_base_F: Helicopter_Base_F {
GVAR(hitpointPositions)[] = {{"HitVRotor", {-0.5,-5.55,1.2}}, {"HitHRotor", {0,1.8,1.5}}};
};
class B_APC_Tracked_01_base_F;
class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F {
GVAR(hitpointPositions)[] = {{"HitTurret", {0,-2,0}}};
};
class Tank_F;
class APC_Tracked_02_base_F: Tank_F {
class EGVAR(interaction,anims) {
class showTracks {
phase = 0;
positions[] = {{-1.7, -3.875, -0.7}, {1.7, -3.875, -0.7}};
items[] = {"ACE_Track", "ACE_Track", "ACE_Track"};
name = CSTRING(RemoveTrack);
text = CSTRING(RemovingTrack);
};
};
};
class Car_F: Car {
class HitPoints;
};
class Offroad_02_base_F: Car_F {
class EGVAR(interaction,anims) {
class hideSpareWheel {
selections[] = {"spare_wheel"};
items[] = {"ACE_Wheel"};
name = CSTRING(RemoveWheel);
text = CSTRING(RemovingWheel);
};
};
};
class Truck_F: Car_F {
class HitPoints: HitPoints {
class HitLBWheel;
class HitRBWheel;
};
};
class Truck_03_base_F: Truck_F {
class HitPoints: HitPoints {
class HitLBWheel: HitLBWheel {
name = "wheel_1_4_steering"; // return original values back to fix double wheel hitpoint
};
class HitRBWheel: HitRBWheel {
name = "wheel_2_4_steering";
};
};
};
class Truck_01_viv_base_F;
class Truck_01_cargo_base_F: Truck_01_viv_base_F {
class EGVAR(interaction,anims) {
class Tyre1_hide {
selections[] = {"tyre1_hide"};
items[] = {"ACE_Wheel"};
name = CSTRING(RemoveWheel);
text = CSTRING(RemovingWheel);
};
};
};
class Truck_01_flatbed_base_F: Truck_01_viv_base_F {
class EGVAR(interaction,anims) {
class Tyre1_hide {
selections[] = {"tyre1_hide"};
items[] = {"ACE_Wheel"};
name = CSTRING(RemoveWheel);
text = CSTRING(RemovingWheel);
};
};
};
class Quadbike_01_base_F: Car_F {
GVAR(hitpointPositions)[] = { {"HitEngine", {0, 0.5, -0.7}}, {"HitFuel", {0, 0, -0.5}} };
};
class Hatchback_01_base_F: Car_F {
GVAR(hitpointPositions)[] = {{"HitBody", {0, 0.7, -0.5}}, {"HitFuel", {0, -1.75, -0.75}}};
};
class Van_02_base_F: Truck_F {
class EGVAR(interaction,anims) {
class spare_tyre_hide {
positions[] = {"[[-1.2, -3.7, -0.4], [-0.45, -3.5, -0.4]] select (_target animationPhase 'Door_4_source' == 0)"};
items[] = {"ACE_Wheel"};
name = CSTRING(RemoveWheel);
text = CSTRING(RemovingWheel);
};
};
};
};