Merge pull request #2361 from acemod/medical-adjustments2

Medical adjustments2
This commit is contained in:
Glowbal 2015-09-07 15:51:27 +02:00
commit 7b349ab388
131 changed files with 980 additions and 1756 deletions

View File

@ -5,7 +5,7 @@
#define MAJOR 3 #define MAJOR 3
#define MINOR 2 #define MINOR 2
#define PATCHLVL 2 #define PATCHLVL 3
#define BUILD 0 #define BUILD 0
#define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION MAJOR.MINOR.PATCHLVL.BUILD

View File

@ -7,6 +7,7 @@ class ACE_Medical_Actions {
category = "bandage"; category = "bandage";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"All"}; allowedSelections[] = {"All"};
allowSelfTreatment = 1;
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 5; treatmentTime = 5;
treatmentTimeSelfCoef = 1; treatmentTimeSelfCoef = 1;
@ -32,6 +33,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Inject_Morphine); displayName = CSTRING(Inject_Morphine);
displayNameProgress = CSTRING(Injecting_Morphine); displayNameProgress = CSTRING(Injecting_Morphine);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 1;
category = "medication"; category = "medication";
treatmentTime = 2; treatmentTime = 2;
items[] = {"ACE_morphine"}; items[] = {"ACE_morphine"};
@ -43,6 +45,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Inject_Epinephrine); displayName = CSTRING(Inject_Epinephrine);
displayNameProgress = CSTRING(Injecting_Epinephrine); displayNameProgress = CSTRING(Injecting_Epinephrine);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 1;
category = "medication"; category = "medication";
requiredMedic = 1; requiredMedic = 1;
treatmentTime = 3; treatmentTime = 3;
@ -55,6 +58,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Transfuse_Blood); displayName = CSTRING(Transfuse_Blood);
displayNameProgress = CSTRING(Transfusing_Blood); displayNameProgress = CSTRING(Transfusing_Blood);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 0;
category = "advanced"; category = "advanced";
requiredMedic = 1; requiredMedic = 1;
treatmentTime = 20; treatmentTime = 20;
@ -93,7 +97,7 @@ class ACE_Medical_Actions {
displayNameProgress = CSTRING(Actions_Diagnosing); displayNameProgress = CSTRING(Actions_Diagnosing);
category = "examine"; category = "examine";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"head"}; allowedSelections[] = {"head", "body"};
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 1; treatmentTime = 1;
items[] = {}; items[] = {};
@ -105,6 +109,29 @@ class ACE_Medical_Actions {
itemConsumed = 0; itemConsumed = 0;
litter[] = {}; litter[] = {};
}; };
class CPR: Bandage {
displayName = CSTRING(Actions_CPR);
displayNameProgress = CSTRING(Actions_PerformingCPR);
category = "advanced";
treatmentLocations[] = {"All"};
allowedSelections[] = {"body"};
allowSelfTreatment = 0;
requiredMedic = 0;
treatmentTime = 15;
items[] = {};
condition = QUOTE(!([(_this select 1)] call ace_common_fnc_isAwake) && GVAR(enableRevive)>0);
callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR));
callbackFailure = "";
callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)";
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
animationCaller = "AinvPknlMstpSlayWnonDnon_medic";
animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic";
animationCallerSelf = "";
animationCallerSelfProne = "";
itemConsumed = 0;
litter[] = {};
};
}; };
class Advanced { class Advanced {
@ -115,6 +142,7 @@ class ACE_Medical_Actions {
// Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All. // Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All.
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"All"}; allowedSelections[] = {"All"};
allowSelfTreatment = 1;
// What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor // What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor
requiredMedic = 0; requiredMedic = 0;
// The time it takes for a treatment action to complete. Time is in seconds. // The time it takes for a treatment action to complete. Time is in seconds.
@ -188,6 +216,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Actions_Blood4_1000); displayName = CSTRING(Actions_Blood4_1000);
displayNameProgress = CSTRING(Transfusing_Blood); displayNameProgress = CSTRING(Transfusing_Blood);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 0;
category = "advanced"; category = "advanced";
items[] = {"ACE_bloodIV"}; items[] = {"ACE_bloodIV"};
requiredMedic = 1; requiredMedic = 1;
@ -238,6 +267,7 @@ class ACE_Medical_Actions {
category = "advanced"; category = "advanced";
items[] = {"ACE_surgicalKit"}; items[] = {"ACE_surgicalKit"};
treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)};
allowSelfTreatment = 0;
requiredMedic = QGVAR(medicSetting_SurgicalKit); requiredMedic = QGVAR(medicSetting_SurgicalKit);
patientStateCondition = QGVAR(useCondition_SurgicalKit); patientStateCondition = QGVAR(useCondition_SurgicalKit);
treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)";
@ -253,6 +283,7 @@ class ACE_Medical_Actions {
category = "advanced"; category = "advanced";
items[] = {"ACE_personalAidKit"}; items[] = {"ACE_personalAidKit"};
treatmentLocations[] = {QGVAR(useLocation_PAK)}; treatmentLocations[] = {QGVAR(useLocation_PAK)};
allowSelfTreatment = 0;
requiredMedic = QGVAR(medicSetting_PAK); requiredMedic = QGVAR(medicSetting_PAK);
patientStateCondition = QGVAR(useCondition_PAK); patientStateCondition = QGVAR(useCondition_PAK);
treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime));
@ -297,6 +328,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Check_Response); displayName = CSTRING(Check_Response);
callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); callbackSuccess = QUOTE(DFUNC(actionCheckResponse));
displayNameProgress = CSTRING(Check_Response_Content); displayNameProgress = CSTRING(Check_Response_Content);
allowSelfTreatment = 0;
}; };
class RemoveTourniquet: Tourniquet { class RemoveTourniquet: Tourniquet {
displayName = CSTRING(Actions_RemoveTourniquet); displayName = CSTRING(Actions_RemoveTourniquet);
@ -313,6 +345,7 @@ class ACE_Medical_Actions {
category = "advanced"; category = "advanced";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"body"}; allowedSelections[] = {"body"};
allowSelfTreatment = 0;
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 15; treatmentTime = 15;
items[] = {}; items[] = {};
@ -334,6 +367,7 @@ class ACE_Medical_Actions {
displayNameProgress = CSTRING(PlacingInBodyBag); displayNameProgress = CSTRING(PlacingInBodyBag);
category = "advanced"; category = "advanced";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowSelfTreatment = 0;
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 15; treatmentTime = 15;
items[] = {"ACE_bodyBag"}; items[] = {"ACE_bodyBag"};
@ -605,6 +639,7 @@ class ACE_Medical_Advanced {
class vehiclecrash { class vehiclecrash {
thresholds[] = {{0.25, 5}}; thresholds[] = {{0.25, 5}};
selectionSpecific = 0; selectionSpecific = 0;
lethalDamage = 0.2;
}; };
class backblast { class backblast {
thresholds[] = {{0, 2},{0.55, 5}, {1, 6}}; thresholds[] = {{0, 2},{0.55, 5}, {1, 6}};
@ -622,6 +657,7 @@ class ACE_Medical_Advanced {
class falling { class falling {
thresholds[] = {{0.1, 1}}; thresholds[] = {{0.1, 1}};
selectionSpecific = 1; selectionSpecific = 1;
lethalDamage = 0.4;
}; };
class ropeburn { class ropeburn {
thresholds[] = {{0.1, 1}}; thresholds[] = {{0.1, 1}};

View File

@ -220,7 +220,7 @@ class ACE_Settings {
description = CSTRING(menuTypeDescription); description = CSTRING(menuTypeDescription);
typeName = "SCALAR"; typeName = "SCALAR";
value = 0; value = 0;
values[] = {CSTRING(useSelection)/*, CSTRING(useRadial)*/}; values[] = {CSTRING(useSelection), CSTRING(useRadial), "Disabled"};
// isClientSettable = 1; isClientSettable = 1;
}; };
}; };

View File

@ -2,12 +2,12 @@
#define MEDICAL_ACTION_DISTANCE 1.75 #define MEDICAL_ACTION_DISTANCE 1.75
class CfgVehicles { class CfgVehicles {
class Logic; class Logic;
class Module_F: Logic { class Module_F: Logic {
class ArgumentsBaseUnits { class ArgumentsBaseUnits {
}; };
}; };
class ACE_Module; class ACE_Module;
class ACE_moduleMedicalSettings: ACE_Module { class ACE_moduleMedicalSettings: ACE_Module {
scope = 2; scope = 2;
@ -19,6 +19,7 @@ class CfgVehicles {
isGlobal = 1; isGlobal = 1;
isTriggerActivated = 0; isTriggerActivated = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class level { class level {
displayName = CSTRING(MedicalSettings_level_DisplayName); displayName = CSTRING(MedicalSettings_level_DisplayName);
@ -137,6 +138,7 @@ class CfgVehicles {
defaultValue = 1; defaultValue = 1;
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(MedicalSettings_Module_Description); description = CSTRING(MedicalSettings_Module_Description);
sync[] = {}; sync[] = {};
@ -154,6 +156,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class enableFor { class enableFor {
displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName);
@ -256,13 +259,13 @@ class CfgVehicles {
defaultValue = 1; defaultValue = 1;
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AdvancedMedicalSettings_Module_Description); description = CSTRING(AdvancedMedicalSettings_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
class ACE_moduleReviveSettings: ACE_Module { class ACE_moduleReviveSettings: ACE_Module {
scope = 2; scope = 2;
displayName = CSTRING(ReviveSettings_Module_DisplayName); displayName = CSTRING(ReviveSettings_Module_DisplayName);
@ -273,6 +276,7 @@ class CfgVehicles {
isGlobal = 1; isGlobal = 1;
isTriggerActivated = 0; isTriggerActivated = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class enableRevive { class enableRevive {
displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); displayName = CSTRING(ReviveSettings_enableRevive_DisplayName);
@ -298,11 +302,13 @@ class CfgVehicles {
defaultValue = -1; defaultValue = -1;
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(ReviveSettings_Module_Description); description = CSTRING(ReviveSettings_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
class ACE_moduleAssignMedicRoles: Module_F { class ACE_moduleAssignMedicRoles: Module_F {
scope = 2; scope = 2;
displayName = CSTRING(AssignMedicRoles_Module_DisplayName); displayName = CSTRING(AssignMedicRoles_Module_DisplayName);
@ -314,6 +320,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class EnableList { class EnableList {
displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName); displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName);
@ -342,6 +349,7 @@ class CfgVehicles {
}; };
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AssignMedicRoles_Module_Description); description = CSTRING(AssignMedicRoles_Module_Description);
sync[] = {}; sync[] = {};
@ -359,6 +367,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class EnableList { class EnableList {
displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName); displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName);
@ -384,11 +393,13 @@ class CfgVehicles {
}; };
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AssignMedicVehicle_Module_Description); description = CSTRING(AssignMedicVehicle_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
class ACE_moduleAssignMedicalFacility: Module_F { class ACE_moduleAssignMedicalFacility: Module_F {
scope = 2; scope = 2;
displayName = CSTRING(AssignMedicalFacility_Module_DisplayName); displayName = CSTRING(AssignMedicalFacility_Module_DisplayName);
@ -400,6 +411,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class enabled { class enabled {
displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName);
@ -407,70 +419,52 @@ class CfgVehicles {
typeName = "BOOL"; typeName = "BOOL";
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AssignMedicalFacility_Module_Description); description = CSTRING(AssignMedicalFacility_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
#define ARM_LEG_ARMOR_DEFAULT 2 #define ARM_LEG_ARMOR_DEFAULT 3
#define ARM_LEG_ARMOR_BETTER 3 #define ARM_LEG_ARMOR_BETTER 5
#define ARM_LEG_ARMOR_CSAT 4 #define ARM_LEG_ARMOR_CSAT 4
class Man; class Land;
class CAManBase: Man { class Man: Land {
class HitPoints { class HitPoints;
class HitHead; };
class HitBody;
// "DEACTIVE" DEFAULT HITPOINTS
class HitHands {
armor = 999; //armor = 2;
explosionShielding = 0; //explosionShielding = 1;
material = -1;
minimalHit = 0;
name = "";
passThrough = 1;
radius = 0; //radius = 0.06;
visual = "injury_hands";
};
class HitLegs {
armor = 999; //armor = 2;
explosionShielding = 0; //explosionShielding = 1;
material = -1;
minimalHit = 0;
name = "";
passThrough = 1;
radius = 0; //radius = 0.08;
visual = "injury_legs";
};
class CAManBase: Man {
class HitPoints: HitPoints { // custom hitpoints. addons might want to adjust these accordingly
class HitLeftArm { class HitLeftArm {
armor = ARM_LEG_ARMOR_DEFAULT; //2; armor = ARM_LEG_ARMOR_DEFAULT;
explosionShielding = 1;
material = -1; material = -1;
minimalHit = 0; name = "hand_l"; // @todo hopefully these still include the whole arm + hands
name = "hand_l";
passThrough = 1;
radius = 0.06;
visual = "injury_hands";
};
class HitRightArm: HitLeftArm {
name = "hand_r";
};
class HitLeftLeg {
armor = ARM_LEG_ARMOR_DEFAULT; //2;
explosionShielding = 1;
material = -1;
minimalHit = 0;
name = "leg_l";
passThrough = 1; passThrough = 1;
radius = 0.08; radius = 0.08;
explosionShielding = 1;
visual = "injury_hands";
minimalHit = 0.01;
};
class HitRightArm: HitLeftArm {
name = "hand_r"; // @todo hopefully these still include the whole arm + hands
};
class HitLeftLeg {
armor = ARM_LEG_ARMOR_DEFAULT;
material = -1;
name = "leg_l";
passThrough = 1;
radius = 0.1;
explosionShielding = 1;
visual = "injury_legs"; visual = "injury_legs";
minimalHit = 0.01;
}; };
class HitRightLeg: HitLeftLeg { class HitRightLeg: HitLeftLeg {
name = "leg_r"; name = "leg_r";
}; };
}; };
class ACE_SelfActions { class ACE_SelfActions {
#include "ACE_Medical_SelfActions.hpp" #include "ACE_Medical_SelfActions.hpp"
}; };
@ -529,23 +523,19 @@ class CfgVehicles {
class B_Soldier_04_f: B_Soldier_base_F { class B_Soldier_04_f: B_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -554,23 +544,19 @@ class CfgVehicles {
class B_Soldier_05_f: B_Soldier_base_F { class B_Soldier_05_f: B_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -581,23 +567,19 @@ class CfgVehicles {
class I_Soldier_03_F: I_Soldier_base_F { class I_Soldier_03_F: I_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -606,23 +588,19 @@ class CfgVehicles {
class I_Soldier_04_F: I_Soldier_base_F { class I_Soldier_04_F: I_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -631,61 +609,88 @@ class CfgVehicles {
class O_Soldier_base_F: SoldierEB { class O_Soldier_base_F: SoldierEB {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
}; };
}; };
class O_Soldier_02_F: O_Soldier_base_F { class O_Soldier_02_F: O_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
}; };
}; };
class O_officer_F: O_Soldier_base_F {
class HitPoints: HitPoints {
class HitHead;
class HitBody;
class HitHands;
class HitLegs;
class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_CSAT; // @todo is that suppossed to be the case?
};
class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_CSAT;
};
class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_CSAT;
};
class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_CSAT;
};
};
};
class O_Protagonist_VR_F: O_Soldier_base_F {
class HitPoints: HitPoints {
class HitHead;
class HitBody;
class HitHands;
class HitLegs;
class HitLeftArm: HitLeftArm {
armor = 2;
};
class HitRightArm: HitRightArm {
armor = 2;
};
class HitLeftLeg: HitLeftLeg {
armor = 2;
};
class HitRightLeg: HitRightLeg {
armor = 2;
};
};
};
class MapBoard_altis_F; class MapBoard_altis_F;
class ACE_bodyBagObject: MapBoard_altis_F { class ACE_bodyBagObject: MapBoard_altis_F {
XEH_ENABLED; XEH_ENABLED;

View File

@ -1,10 +1,12 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; params ["_unit"];
_unit = _this select 0;
_unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}];
if (local _unit) then { if (local _unit) then {
[_unit] call FUNC(init); if (!EGVAR(common,settingsInitFinished)) exitWith {
EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(init), [_unit]];
};
[_unit] call FUNC(init);
}; };

View File

@ -11,10 +11,9 @@ GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"];
["interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call EFUNC(common,addEventHandler); ["interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call EFUNC(common,addEventHandler);
["medical_onUnconscious", { ["medical_onUnconscious", {
if (local (_this select 0)) then { params ["_unit", "_status"];
private ["_unit"]; if (local _unit) then {
_unit = _this select 0; if (_status) then {
if (_this select 1) then {
_unit setVariable ["tf_globalVolume", 0.4]; _unit setVariable ["tf_globalVolume", 0.4];
_unit setVariable ["tf_voiceVolume", 0, true]; _unit setVariable ["tf_voiceVolume", 0, true];
_unit setVariable ["tf_unable_to_use_radio", true, true]; _unit setVariable ["tf_unable_to_use_radio", true, true];
@ -35,10 +34,8 @@ GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"];
// Initialize all effects // Initialize all effects
_fnc_createEffect = { _fnc_createEffect = {
private ["_type", "_layer", "_default", "_effect"]; private "_effect";
_type = _this select 0; params ["_type", "_layer", "_default"];
_layer = _this select 1;
_default = _this select 2;
_effect = ppEffectCreate [_type, _layer]; _effect = ppEffectCreate [_type, _layer];
_effect ppEffectForceInNVG true; _effect ppEffectForceInNVG true;
@ -245,30 +242,28 @@ GVAR(lastHeartBeatSound) = ACE_time;
}, 0, []] call CBA_fnc_addPerFrameHandler; }, 0, []] call CBA_fnc_addPerFrameHandler;
if (USE_WOUND_EVENT_SYNC) then {
// broadcast injuries to JIP clients in a MP session
if (isMultiplayer && hasInterface) then {
["playerChanged", {
EXPLODE_2_PVT(_this,_newPlayer,_oldPlayer);
if (alive _newPlayer) then {
// We are only pulling the wounds for the units in the player group. Anything else will come when the unit interacts with them.
{
[_x, _newPlayer] call FUNC(requestWoundSync);
}foreach units group _newPlayer;
};
}] call EFUNC(common,addEventhandler);
};
};
[ ["SettingsInitialized", {
{(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, if (GVAR(level) == 2) exitwith {
{(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.9}, [
{(([_this select 0] call FUNC(getBloodLoss)) > 0.25)}, {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)},
{((_this select 0) getvariable [QGVAR(inReviveState), false])}, {(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.9},
{((_this select 0) getvariable [QGVAR(inCardiacArrest), false])}, {(([_this select 0] call FUNC(getBloodLoss)) > 0.25)},
{((_this select 0) getvariable ["ACE_isDead", false])}, {((_this select 0) getvariable [QGVAR(inReviveState), false])},
{(((_this select 0) getvariable [QGVAR(airwayStatus), 100]) < 80)} {((_this select 0) getvariable [QGVAR(inCardiacArrest), false])},
] call FUNC(addUnconsciousCondition); {((_this select 0) getvariable ["ACE_isDead", false])},
{(((_this select 0) getvariable [QGVAR(airwayStatus), 100]) < 80)}
] call FUNC(addUnconsciousCondition);
};
[
{(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 40)},
{(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.6},
{(([_this select 0] call FUNC(getBloodLoss)) > 0.1)},
{((_this select 0) getvariable [QGVAR(inReviveState), false])},
{((_this select 0) getvariable ["ACE_isDead", false])}
] call FUNC(addUnconsciousCondition);
}] call EFUNC(common,addEventHandler);
// Prevent all types of interaction while unconscious // Prevent all types of interaction while unconscious
// @todo: probably remove this when CBA keybind hold key works properly // @todo: probably remove this when CBA keybind hold key works properly

View File

@ -84,6 +84,7 @@ PREP(treatmentAdvanced_medication);
PREP(treatmentAdvanced_medicationLocal); PREP(treatmentAdvanced_medicationLocal);
PREP(treatmentAdvanced_surgicalKit_onProgress); PREP(treatmentAdvanced_surgicalKit_onProgress);
PREP(treatmentBasic_bandage); PREP(treatmentBasic_bandage);
PREP(treatmentBasic_bandageLocal);
PREP(treatmentBasic_bloodbag); PREP(treatmentBasic_bloodbag);
PREP(treatmentBasic_bloodbagLocal); PREP(treatmentBasic_bloodbagLocal);
PREP(treatmentBasic_epipen); PREP(treatmentBasic_epipen);

View File

@ -1,11 +1,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; params ["_unit"];
_unit = _this select 0;
if !(local _unit) exitWith {};
// reset all variables. @todo GROUP respawn?
[_unit] call FUNC(init); [_unit] call FUNC(init);
// Reset captive status for respawning unit // Reset captive status for respawning unit

View File

@ -7,15 +7,12 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target","_selectionName"]; params ["_caller", "_target", "_selectionName"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */

View File

@ -7,25 +7,22 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target","_selectionName","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; private ["_bloodPressure", "_logOutPut", "_output"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName"];
_target = _this select 1;
_selectionName = _this select 2;
_bloodPressure = [_target] call FUNC(getBloodPressure); _bloodPressure = if (!alive _target) then {
if (!alive _target) then { [0,0]
_bloodPressure = [0,0]; } else {
[_target] call FUNC(getBloodPressure)
}; };
_bloodPressure params ["_bloodPressureHigh", "_bloodPressureLow"];
_bloodPressureHigh = _bloodPressure select 1;
_bloodPressureLow = _bloodPressure select 0;
_output = ""; _output = "";
_logOutPut = ""; _logOutPut = "";
if ([_caller] call FUNC(isMedic)) then { if ([_caller] call FUNC(isMedic)) then {

View File

@ -7,15 +7,13 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target","_selectionName"]; params ["_caller","_target", "_selectionName"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */

View File

@ -7,17 +7,15 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_unit", "_selectionName", "_heartRateOutput", "_heartRate", "_logOutPut"]; private ["_heartRateOutput", "_heartRate", "_logOutPut"];
_caller = _this select 0; params ["_caller", "_unit", "_selectionName"];
_unit = _this select 1;
_selectionName = _this select 2;
_heartRate = _unit getvariable [QGVAR(heartRate), 80]; _heartRate = _unit getvariable [QGVAR(heartRate), 80];
if (!alive _unit) then { if (!alive _unit) then {

View File

@ -7,23 +7,17 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target", "_output"]; private ["_output"];
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
_output = ""; _output = [LSTRING(Check_Response_Unresponsive), LSTRING(Check_Response_Responsive)] select ([_target] call EFUNC(common,isAwake));
if ([_target] call EFUNC(common,isAwake)) then {
_output = LSTRING(Check_Response_Responsive);
} else {
_output = LSTRING(Check_Response_Unresponsive);
};
["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName)], 2, _caller]] call EFUNC(common,targetEvent); ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName)], 2, _caller]] call EFUNC(common,targetEvent);

View File

@ -7,16 +7,15 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_genericMessages"]; private "_genericMessages";
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
_genericMessages = [LSTRING(diagnoseMessage)]; _genericMessages = [LSTRING(diagnoseMessage)];

View File

@ -7,20 +7,18 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target","_vehicle"]; private "_vehicle";
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
if ([_target] call EFUNC(common,isAwake)) exitwith { if ([_target] call EFUNC(common,isAwake)) exitwith {
// TODO localization ["displayTextStructured", [_caller], [[LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent);
["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent);
}; };
if ([_target] call FUNC(isBeingCarried)) then { if ([_target] call FUNC(isBeingCarried)) then {
[_caller, _target] call EFUNC(dragging,dropObject_carry); [_caller, _target] call EFUNC(dragging,dropObject_carry);

View File

@ -14,9 +14,8 @@
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_caller,_target);
private ["_position", "_headPos", "_spinePos", "_dirVect", "_direction", "_bodyBag"]; private ["_position", "_headPos", "_spinePos", "_dirVect", "_direction", "_bodyBag"];
params ["_caller", "_target"];
if (alive _target) then { if (alive _target) then {
[_target, true] call FUNC(setDead); [_target, true] call FUNC(setDead);

View File

@ -8,17 +8,15 @@
* 2: SelectionName <STRING> * 2: SelectionName <STRING>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_part", "_selectionName", "_tourniquets", "_output"]; private ["_part", "_tourniquets", "_output"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName"];
_target = _this select 1;
_selectionName = _this select 2;
// grab the required data // grab the required data
_part = [_selectionName] call FUNC(selectionNameToNumber); _part = [_selectionName] call FUNC(selectionNameToNumber);
@ -26,7 +24,7 @@ _tourniquets = _target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]];
// Check if there is a tourniquet on this bodypart // Check if there is a tourniquet on this bodypart
if ((_tourniquets select _part) == 0) exitwith { if ((_tourniquets select _part) == 0) exitwith {
_output = "There is no tourniquet on this body part!"; _output = LSTRING(noTourniquetOnBodyPart);
["displayTextStructured", [_caller], [_output, 1.5, _caller]] call EFUNC(common,targetEvent); ["displayTextStructured", [_caller], [_output, 1.5, _caller]] call EFUNC(common,targetEvent);
}; };

View File

@ -5,20 +5,17 @@
* Arguments: * Arguments:
* 0: The medic <OBJECT> * 0: The medic <OBJECT>
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* 2: Drag after unload <BOOL> <OPTIONAL> * 2: Drag after unload <BOOL> (default: false)
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_drag"]; params ["_caller", "_target", ["_drag", false]];
_caller = _this select 0;
_target = _this select 1;
_drag = if (count _this > 2) then {_this select 2} else {false};
// cannot unload a unit not in a vehicle. // cannot unload a unit not in a vehicle.
if (vehicle _target == _target) exitwith {}; if (vehicle _target == _target) exitwith {};

View File

@ -9,18 +9,15 @@
* 3: callback <CODE> * 3: callback <CODE>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_value", "_time", "_adjustment", "_callBack"];
_unit = [_this, 0, objNull, [objNull]] call BIS_fnc_Param; params [["_unit", objNull, [objNull]], ["_value", 0, [0]], ["_time", 1, [0]], ["_callBack", {}, [{}]]];
_value = [_this, 1, 0, [0]] call BIS_fnc_Param;
_time = [_this, 2, 1, [0]] call BIS_fnc_Param;
_callBack = [_this, 3, {}, [{}]] call BIS_fnc_Param;
_adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []]; _adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []];
_adjustment pushback [_value, _time, _callBack]; _adjustment pushback [_value, _time, _callBack];

View File

@ -6,16 +6,14 @@
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_force"]; params ["_unit", ["_force", false]];
_unit = _this select 0;
_force = if (count _this > 1) then {_this select 1} else {false};
if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { if ([_unit] call FUNC(hasMedicalEnabled) || _force) then {
@ -27,13 +25,13 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then {
_unit setvariable [QGVAR(addedToUnitLoop), true, true]; _unit setvariable [QGVAR(addedToUnitLoop), true, true];
[{ [{
private ["_unit", "_interval"]; params ["_args", "_idPFH"];
_unit = (_this select 0) select 0; _args params ["_unit", "_interval"];
_interval = ACE_time - ((_this select 0) select 1); _interval = ACE_time - _interval;
(_this select 0) set [1, ACE_time]; (_this select 0) set [1, ACE_time];
if (!alive _unit || !local _unit) then { if (!alive _unit || !local _unit) then {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
if (!local _unit) then { if (!local _unit) then {
if (GVAR(level) >= 2) then { if (GVAR(level) >= 2) then {
_unit setvariable [QGVAR(heartRate), _unit getvariable [QGVAR(heartRate), 80], true]; _unit setvariable [QGVAR(heartRate), _unit getvariable [QGVAR(heartRate), 80], true];
@ -47,9 +45,12 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then {
private "_pain"; private "_pain";
_pain = _unit getvariable [QGVAR(pain), 0]; _pain = _unit getvariable [QGVAR(pain), 0];
if (_pain > (_unit getvariable [QGVAR(painSuppress), 0])) then { if (_pain > (_unit getvariable [QGVAR(painSuppress), 0])) then {
if (_pain > 0.7 && {random(1) > 0.6}) then { // This introduces wierd unconscious behaviour for basic medical and possibly also advanced.
// TODO This is disabled as it's considered non critical code.
// We will need to decide if we want unconscious triggered on high pain levels or if we can get rid of this entirely.
/*if (_pain > 0.7 && {random(1) > 0.6}) then {
[_unit] call FUNC(setUnconscious); [_unit] call FUNC(setUnconscious);
}; };*/
[_unit, _pain] call FUNC(playInjuredSound); [_unit, _pain] call FUNC(playInjuredSound);
}; };

View File

@ -9,28 +9,24 @@
* 3: The arguments for localization <ARRAY> * 3: The arguments for localization <ARRAY>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_type", "_message", "_arguments", "_lastNumber", "_moment", "_logVarName", "_log","_newLog", "_logs"]; private ["_moment", "_logVarName", "_log","_newLog", "_logs"];
_unit = _this select 0; params ["_unit", "_type", "_message", "_arguments"];
_type = _this select 1;
_message = _this select 2;
_arguments = _this select 3;
if (!local _unit) exitwith { if (!local _unit) exitwith {
[_this, QUOTE(DFUNC(addToLog)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_this, QFUNC(addToLog), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */
}; };
_lastNumber = date select 4; date params ["", "", "", "_minute", "_hour"];
_moment = format["%1:%2",date select 3, _lastNumber];
if (_lastNumber < 10) then { _moment = format [ (["%1:%2", "%1:0%2"] select (_minute < 10)), _hour, _minute];
_moment = format["%1:0%2",date select 3, _lastNumber];
};
_logVarName = format[QGVAR(logFile_%1), _type]; _logVarName = format[QGVAR(logFile_%1), _type];
_log = _unit getvariable [_logVarName, []]; _log = _unit getvariable [_logVarName, []];
@ -41,10 +37,10 @@ if (count _log >= 8) then {
if (_foreachIndex > 0) then { if (_foreachIndex > 0) then {
_newLog pushback _x; _newLog pushback _x;
}; };
}foreach _log; } foreach _log;
_log = _newLog; _log = _newLog;
}; };
_log pushback [_message,_moment,_type, _arguments]; _log pushback [_message, _moment, _type, _arguments];
_unit setvariable [_logVarName, _log, true]; _unit setvariable [_logVarName, _log, true];
["medical_onLogEntryAdded", [_unit, _type, _message, _arguments]] call EFUNC(common,localEvent); ["medical_onLogEntryAdded", [_unit, _type, _message, _arguments]] call EFUNC(common,localEvent);

View File

@ -7,16 +7,15 @@
* 1: The new item classname <STRING> * 1: The new item classname <STRING>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_newItem", "_log", "_inList", "_amount"]; private ["_log", "_inList", "_amount"];
_unit = _this select 0; params ["_unit", "_newItem"];
_newItem = _this select 1;
if (!local _unit) exitwith { if (!local _unit) exitwith {
[_this, QUOTE(DFUNC(addToTriageList)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_this, QUOTE(DFUNC(addToTriageList)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */
@ -36,7 +35,7 @@ _amount = 1;
_amount = (_info select 1); _amount = (_info select 1);
_inList = true; _inList = true;
}; };
}foreach _log; } foreach _log;
if (!_inList) then { if (!_inList) then {
_log pushback [_newItem, 1, ACE_time]; _log pushback [_newItem, 1, ACE_time];

View File

@ -3,14 +3,13 @@
* Adds new condition for the unconscious state. Conditions are not actively checked for units unless unit is in unconscious state. * Adds new condition for the unconscious state. Conditions are not actively checked for units unless unit is in unconscious state.
* *
* Arguments: * Arguments:
* 0: Code, should return a boolean <CODE> * 0-N: Code, should return a boolean <CODE>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
if (isnil QGVAR(unconsciousConditions)) then { if (isnil QGVAR(unconsciousConditions)) then {
@ -21,5 +20,5 @@ if (typeName _this == typeName []) then {
if (typeName _x == typeName {}) then { if (typeName _x == typeName {}) then {
GVAR(unconsciousConditions) pushback _x; GVAR(unconsciousConditions) pushback _x;
}; };
}foreach _this; } foreach _this;
}; };

View File

@ -13,8 +13,7 @@
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
params ["_vehicle", "_player", "_parameters"];
EXPLODE_3_PVT(_this,_vehicle,_player,_parameters);
private ["_actions", "_unit"]; private ["_actions", "_unit"];
_actions = []; _actions = [];

View File

@ -18,10 +18,10 @@
private ["_pain"]; private ["_pain"];
PARAMS_2(_unit,_addedPain); params ["_unit", "_addedPain"];
//Only run on local units: //Only run on local units:
if (!local _unit) exitWith {ERROR("unit is not local");}; if (!local _unit) exitWith {ERROR("unit is not local");};
TRACE_3("ACE_DEBUG: adjustPainLevel Called",_unit, _pain, _addedPain);
//Ignore if medical system disabled: //Ignore if medical system disabled:
if (GVAR(level) == 0) exitWith {}; if (GVAR(level) == 0) exitWith {};

View File

@ -14,9 +14,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_caller", "_accessLevel", "_return"]; private ["_accessLevel", "_return"];
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
_accessLevel = _target getvariable [QGVAR(allowSharedEquipmentAccess), -1]; _accessLevel = _target getvariable [QGVAR(allowSharedEquipmentAccess), -1];

View File

@ -16,36 +16,35 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition", "_allowedSelections"]; private ["_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition", "_allowedSelections"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName", "_className"];
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
if !(_target isKindOf "CAManBase") exitWith {false}; if !(_target isKindOf "CAManBase") exitWith { false };
_config = (ConfigFile >> "ACE_Medical_Actions" >> (["Basic", "Advanced"] select (GVAR(level)>=2)) >> _className);
_config = (ConfigFile >> "ACE_Medical_Actions" >> "Basic" >> _className);
if (GVAR(level)>=2) then {
_config = (ConfigFile >> "ACE_Medical_Actions" >> "Advanced" >> _className);
};
if !(isClass _config) exitwith {false}; if !(isClass _config) exitwith {false};
// Allow self treatment check
if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false};
_medicRequired = if (isNumber (_config >> "requiredMedic")) then { _medicRequired = if (isNumber (_config >> "requiredMedic")) then {
getNumber (_config >> "requiredMedic"); getNumber (_config >> "requiredMedic");
} else { } else {
// Check for required class // Check for required class
if (isText (_config >> "requiredMedic")) exitwith { if (isText (_config >> "requiredMedic")) exitwith {
missionNamespace getvariable [(getText (_config >> "requiredMedic")), 0]; missionNamespace getvariable [(getText (_config >> "requiredMedic")), 0]
}; };
0; 0;
}; };
if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith { false };
_items = getArray (_config >> "items"); _items = getArray (_config >> "items");
if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith { false };
_allowedSelections = getArray (_config >> "allowedSelections"); _allowedSelections = getArray (_config >> "allowedSelections");
if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith {false}; if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith { false };
_return = true; _return = true;
if (getText (_config >> "condition") != "") then { if (getText (_config >> "condition") != "") then {
@ -61,7 +60,7 @@ if (getText (_config >> "condition") != "") then {
_return = [_caller, _target, _selectionName, _className] call _condition; _return = [_caller, _target, _selectionName, _className] call _condition;
}; };
}; };
if (!_return) exitwith {false}; if (!_return) exitwith { false };
_patientStateCondition = if (isText(_config >> "patientStateCondition")) then { _patientStateCondition = if (isText(_config >> "patientStateCondition")) then {
missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0] missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0]
@ -71,7 +70,7 @@ _patientStateCondition = if (isText(_config >> "patientStateCondition")) then {
if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false};
_locations = getArray (_config >> "treatmentLocations"); _locations = getArray (_config >> "treatmentLocations");
if ("All" in _locations) exitwith {true}; if ("All" in _locations) exitwith { true };
private [ "_medFacility", "_medVeh"]; private [ "_medFacility", "_medVeh"];
_medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))};
@ -93,6 +92,6 @@ _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isI
}; };
}; };
}; };
}foreach _locations; } foreach _locations;
_return; _return;

View File

@ -17,6 +17,7 @@
#include "script_component.hpp" #include "script_component.hpp"
#define MAX_DURATION_CACHE 2 #define MAX_DURATION_CACHE 2
params ["", "_target", "_selection", "_classname"];
// parameters, function, namespace, uid // parameters, function, namespace, uid
[_this, DFUNC(canTreat), _this select 1, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall); [_this, DFUNC(canTreat), _target, format [QGVAR(canTreat_%1_%2), _selection, _classname], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall);

View File

@ -7,16 +7,15 @@
* 1: The caller <OBJECT> * 1: The caller <OBJECT>
* *
* Return Value: * Return Value:
* OBJECT Returns the copy of the unit. If no copy could be made, returns the oldBody * Returns the copy of the unit. If no copy could be made, returns the oldBody <OBJECT>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_oldBody","_newUnit","_class","_group","_position","_side", "_caller", "_name"]; private ["_newUnit", "_class", "_group", "_position", "_side", "_name"];
_oldBody = _this select 0; params ["_oldBody", "_caller"];
_caller = _this select 1;
if (alive _oldBody) exitwith {_oldBody}; // we only want to do this for dead bodies if (alive _oldBody) exitwith {_oldBody}; // we only want to do this for dead bodies

View File

@ -3,11 +3,16 @@
* Spawns litter for the treatment action on the ground around the target * Spawns litter for the treatment action on the ground around the target
* *
* Arguments: * Arguments:
* 0: The target <OBJECT> * 0: The Caller <OBJECT>
* 1: The treatment classname <STRING> * 1: The target <OBJECT>
* 2: The treatment Selection Name <STRING>
* 3: The treatment classname <STRING>
* 4: ?
* 5: Users of Items <?>
* 6: Previous Damage <NUMBER>
* *
* Return Value: * Return Value:
* * None
* *
* Public: No * Public: No
*/ */
@ -16,13 +21,8 @@
#define MIN_ENTRIES_LITTER_CONFIG 3 #define MIN_ENTRIES_LITTER_CONFIG 3
private ["_target", "_className", "_config", "_litter", "_createLitter", "_position", "_createdLitter", "_caller", "_selectionName", "_usersOfItems", "_previousDamage"]; private ["_config", "_litter", "_createLitter", "_position", "_createdLitter"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName", "_className", "", "_usersOfItems", "_previousDamage"];
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
_usersOfItems = _this select 5;
_previousDamage = _this select 6;
if !(GVAR(allowLitterCreation)) exitwith {}; if !(GVAR(allowLitterCreation)) exitwith {};
if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; if (vehicle _caller != _caller || vehicle _target != _target) exitwith {};
@ -38,25 +38,24 @@ if !(isArray (_config >> "litter")) exitwith {};
_litter = getArray (_config >> "litter"); _litter = getArray (_config >> "litter");
_createLitter = { _createLitter = {
private["_position", "_litterClass", "_direction"]; private["_position", "_direction"];
params ["_unit", "_litterClass"];
// @TODO: handle carriers over water // @TODO: handle carriers over water
// For now, don't spawn litter if we are over water to avoid floating litter // For now, don't spawn litter if we are over water to avoid floating litter
if(surfaceIsWater (getPos (_this select 0))) exitWith { false }; if(surfaceIsWater (getPos _unit)) exitWith { false };
_position = getPosATL (_this select 0); _position = getPosATL _unit;
_position = [_position select 0, _position select 1, 0]; _position params ["_posX", "_posY"];
_litterClass = _this select 1; _position = if (random(1) >= 0.5) then {
if (random(1) >= 0.5) then { [_posX + random 1, _posY + random 1, 0]
_position = [(_position select 0) + random 1, (_position select 1) + random 1, _position select 2];
} else { } else {
_position = [(_position select 0) - random 1, (_position select 1) - random 1, _position select 2]; [_posX - random 1, _posY - random 1, 0];
}; };
_direction = (random 360); _direction = (random 360);
// Create the litter, and timeout the event based on the cleanup delay // Create the litter, and timeout the event based on the cleanup delay
// The cleanup delay for events in MP is handled by the server side // The cleanup delay for events in MP is handled by the server side
[QGVAR(createLitter), [_litterClass,_position,_direction], 0] call EFUNC(common,syncedEvent); [QGVAR(createLitter), [_litterClass, _position, _direction], 0] call EFUNC(common,syncedEvent);
true true
}; };
@ -65,11 +64,10 @@ _createdLitter = [];
{ {
if (typeName _x == "ARRAY") then { if (typeName _x == "ARRAY") then {
if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {};
private ["_selection", "_litterCondition", "_litterOptions"];
_selection = _x select 0; _x params ["_selection", "_litterCondition", "_litterOptions"];
if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower.
_litterCondition = _x select 1;
_litterOptions = _x select 2;
if (isnil _litterCondition) then { if (isnil _litterCondition) then {
_litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}};
@ -88,8 +86,8 @@ _createdLitter = [];
if (typeName _x == "STRING") then { if (typeName _x == "STRING") then {
[_target, _x] call _createLitter; [_target, _x] call _createLitter;
}; };
}foreach _litterOptions; } foreach _litterOptions;
}; };
}; };
}; };
}foreach _litter; } foreach _litter;

View File

@ -1,19 +1,21 @@
/** /*
* fn_determineIfFatal.sqf * Author: Glowbal
* @Descr: N/A * Determine If Fatal
* @Author: Glowbal
* *
* @Arguments: [] * Arguments:
* @Return: * 0: Unit <OBJECT>
* @PublicAPI: false * 1: Part <NUMBER>
* 2: with Damage <NUMBER> (default: 0)
*
* Return Value:
* None
*
* Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_part","_damageThreshold", "_withDamage", "_damageBodyPart"]; private ["_damageThreshold", "_damageBodyPart"];
_unit = _this select 0; params ["_unit", "_part", ["_withDamage", 0]];
_part = _this select 1;
_withDamage = if (count _this > 2) then { _this select 2} else {0};
if (!alive _unit) exitwith {true}; if (!alive _unit) exitwith {true};
if (_part < 0 || _part > 5) exitwith {false}; if (_part < 0 || _part > 5) exitwith {false};
@ -36,7 +38,7 @@ if (_part == 0) exitwith {
// Check if damage to body part is higher as damage torso // Check if damage to body part is higher as damage torso
if (_part == 1) exitwith { if (_part == 1) exitwith {
(_damageBodyPart >= (_damageThreshold select 1) && {(random(1) > 0.2)}); (_damageBodyPart >= (_damageThreshold select 1) && {(random(1) > 0.35)});
}; };
// Check if damage to body part is higher as damage limbs // Check if damage to body part is higher as damage limbs
(_damageBodyPart >= (_damageThreshold select 2) && {(random(1) > 0.95)}); (_damageBodyPart >= (_damageThreshold select 2) && {(random(1) > 0.95)});

View File

@ -4,10 +4,11 @@
* *
* Arguments: * Arguments:
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* 1: Show <BOOL> <OPTIONAL> * 1: Show <BOOL> (default: true)
* 2: Selection <NUMBER> (default: 0)
* *
* ReturnValue: * ReturnValue:
* nil * None
* *
* Public: No * Public: No
*/ */
@ -17,13 +18,11 @@
// Exit for basic medical // Exit for basic medical
if (GVAR(level) < 2) exitWith {}; if (GVAR(level) < 2) exitWith {};
private ["_target", "_show", "_selectionN", "_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"]; private ["_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"];
_target = _this select 0; params ["_target", ["_show", true], ["_selectionN", 0]];
_show = if (count _this > 1) then {_this select 1} else {true};
_selectionN = if (count _this > 2) then {_this select 2} else {0};
GVAR(currentSelectedSelectionN) = if (typeName _selectionN == "SCALAR") then {_selectionN} else {0}; GVAR(currentSelectedSelectionN) = [0, _selectionN] select (IS_SCALAR(_selectionN));
GVAR(displayPatientInformationTarget) = if (_show) then {_target} else {ObjNull}; GVAR(displayPatientInformationTarget) = [ObjNull, _target] select _show;
if (USE_WOUND_EVENT_SYNC) then { if (USE_WOUND_EVENT_SYNC) then {
[_target, ACE_player] call FUNC(requestWoundSync); [_target, ACE_player] call FUNC(requestWoundSync);
@ -34,22 +33,22 @@ if (_show) then {
[{ [{
private ["_target", "_display", "_alphaLevel", "_damaged", "_availableSelections", "_openWounds", "_selectionBloodLoss", "_red", "_green", "_blue", "_alphaLevel", "_allInjuryTexts", "_lbCtrl", "_genericMessages"]; private ["_target", "_display", "_alphaLevel", "_damaged", "_availableSelections", "_openWounds", "_selectionBloodLoss", "_red", "_green", "_blue", "_alphaLevel", "_allInjuryTexts", "_lbCtrl", "_genericMessages"];
_target = (_this select 0) select 0; params ["_args", "_idPFH"];
_selectionN = (_this select 0) select 1; _args params ["_target", "_selectionN"];
if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith { if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
if (ACE_player distance _target > MAX_DISTANCE) exitwith { if (ACE_player distance _target > MAX_DISTANCE) exitwith {
("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"];
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
["displayTextStructured", [ACE_player], [[LSTRING(DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player]] call EFUNC(common,targetEvent); ["displayTextStructured", [ACE_player], [[LSTRING(DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player]] call EFUNC(common,targetEvent);
}; };
disableSerialization; disableSerialization;
_display = uiNamespace getvariable QGVAR(DisplayInformation); _display = uiNamespace getvariable QGVAR(DisplayInformation);
if (isnil "_display") exitwith { if (isnil "_display") exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
_allInjuryTexts = []; _allInjuryTexts = [];
@ -81,7 +80,7 @@ if (_show) then {
if !(isnil "_value") then { if !(isnil "_value") then {
_totalIvVolume = _totalIvVolume + (_target getvariable [_x, 0]); _totalIvVolume = _totalIvVolume + (_target getvariable [_x, 0]);
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
if (_totalIvVolume >= 1) then { if (_totalIvVolume >= 1) then {
_genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; _genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]];
}; };
@ -92,33 +91,33 @@ if (_show) then {
_openWounds = _target getvariable [QGVAR(openWounds), []]; _openWounds = _target getvariable [QGVAR(openWounds), []];
private "_amountOf"; private "_amountOf";
{ {
_amountOf = _x select 3; _x params ["", "_x1", "_selectionX", "_amountOf", "_x4"];
// Find how much this bodypart is bleeding // Find how much this bodypart is bleeding
if (_amountOf > 0) then { if (_amountOf > 0) then {
_damaged set[_x select 2, true]; _damaged set[_selectionX, true];
_selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))];
if (_selectionN == (_x select 2)) then { if (_selectionN == _selectionX) then {
// Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this]
if (_amountOf >= 1) then { if (_amountOf >= 1) then {
// TODO localization // TODO localization
_allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf], [1,1,1,1]]; _allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6, _amountOf], [1,1,1,1]];
} else { } else {
// TODO localization // TODO localization
_allInjuryTexts pushback [format["Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [1,1,1,1]]; _allInjuryTexts pushback [format["Partial %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6], [1,1,1,1]];
}; };
}; };
}; };
}foreach _openWounds; } foreach _openWounds;
_bandagedwounds = _target getvariable [QGVAR(bandagedWounds), []]; _bandagedwounds = _target getvariable [QGVAR(bandagedWounds), []];
{ {
_amountOf = _x select 3; _x params ["", "", "_selectionX", "_amountOf", "_x4"];
// Find how much this bodypart is bleeding // Find how much this bodypart is bleeding
if !(_damaged select (_x select 2)) then { if !(_damaged select _selectionX) then {
_selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))];
}; };
if (_selectionN == (_x select 2)) then { if (_selectionN == _selectionX) then {
// Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this]
if (_amountOf > 0) then { if (_amountOf > 0) then {
if (_amountOf >= 1) then { if (_amountOf >= 1) then {
@ -130,7 +129,7 @@ if (_show) then {
}; };
}; };
}; };
}foreach _bandagedwounds; } foreach _bandagedwounds;
} else { } else {
_damaged = [true, true, true, true, true, true]; _damaged = [true, true, true, true, true, true];
{ {
@ -160,7 +159,7 @@ if (_show) then {
_availableSelections = [50,51,52,53,54,55]; _availableSelections = [50,51,52,53,54,55];
{ {
private ["_red", "_green", "_blue"]; private ["_red", "_green", "_blue", "_total"];
_total = _x; _total = _x;
_red = 1; _red = 1;
@ -177,20 +176,22 @@ if (_show) then {
}; };
}; };
(_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; (_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0];
}foreach _selectionBloodLoss; } foreach _selectionBloodLoss;
_lbCtrl = (_display displayCtrl 200); _lbCtrl = (_display displayCtrl 200);
lbClear _lbCtrl; lbClear _lbCtrl;
{ {
_lbCtrl lbAdd (_x select 0); _x params ["_add", "_color"];
_lbCtrl lbSetColor [_foreachIndex, _x select 1]; _lbCtrl lbAdd _add;
}foreach _genericMessages; _lbCtrl lbSetColor [_foreachIndex, _color];
} foreach _genericMessages;
_amountOfGeneric = count _genericMessages; _amountOfGeneric = count _genericMessages;
{ {
_lbCtrl lbAdd (_x select 0); _x params ["_add", "_color"];
_lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _x select 1]; _lbCtrl lbAdd _add;
}foreach _allInjuryTexts; _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _color];
} foreach _allInjuryTexts;
if (count _allInjuryTexts == 0) then { if (count _allInjuryTexts == 0) then {
_lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart)); _lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart));
}; };
@ -202,9 +203,7 @@ if (_show) then {
_logs = _target getvariable [QGVAR(logFile_Activity), []]; _logs = _target getvariable [QGVAR(logFile_Activity), []];
{ {
// [_message,_moment,_type, _arguments] // [_message,_moment,_type, _arguments]
_message = _x select 0; _x params ["_message", "_moment", "_type", "_arguments"];
_moment = _x select 1;
_arguments = _x select 3;
if (isLocalized _message) then { if (isLocalized _message) then {
_message = localize _message; _message = localize _message;
}; };
@ -213,10 +212,10 @@ if (_show) then {
if (typeName _x == "STRING" && {isLocalized _x}) then { if (typeName _x == "STRING" && {isLocalized _x}) then {
_arguments set [_foreachIndex, localize _x]; _arguments set [_foreachIndex, localize _x];
}; };
}foreach _arguments; } foreach _arguments;
_message = format([_message] + _arguments); _message = format([_message] + _arguments);
_logCtrl lbAdd format["%1 %2", _moment, _message]; _logCtrl lbAdd format["%1 %2", _moment, _message];
}foreach _logs; } foreach _logs;
_triageStatus = [_target] call FUNC(getTriageStatus); _triageStatus = [_target] call FUNC(getTriageStatus);
(_display displayCtrl 303) ctrlSetText (_triageStatus select 0); (_display displayCtrl 303) ctrlSetText (_triageStatus select 0);

View File

@ -4,18 +4,18 @@
* *
* Arguments: * Arguments:
* 0: The unit <OBJECT> * 0: The unit <OBJECT>
* 1: Show <BOOL> (default: true)
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_show", "_amount", "_item", "_log", "_message", "_triageCardTexts", "_triageStatus"]; private ["_amount", "_item", "_log", "_message", "_triageCardTexts", "_triageStatus"];
_target = _this select 0; params ["_target", ["_show", true]];
_show = if (count _this > 1) then {_this select 1} else {true};
GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull}; GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull};
@ -25,15 +25,16 @@ if (_show) then {
[{ [{
private ["_target", "_display", "_alphaLevel", "_alphaLevel", "_lbCtrl"]; private ["_target", "_display", "_alphaLevel", "_alphaLevel", "_lbCtrl"];
_target = (_this select 0) select 0; params ["_args", "_idPFH"];
_args params ["_target"];
if (GVAR(TriageCardTarget) != _target) exitwith { if (GVAR(TriageCardTarget) != _target) exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
disableSerialization; disableSerialization;
_display = uiNamespace getvariable QGVAR(triageCard); _display = uiNamespace getvariable QGVAR(triageCard);
if (isnil "_display") exitwith { if (isnil "_display") exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
_triageCardTexts = []; _triageCardTexts = [];
@ -44,8 +45,7 @@ if (_show) then {
_log = _target getvariable [QGVAR(triageCard), []]; _log = _target getvariable [QGVAR(triageCard), []];
{ {
_item = _x select 0; _x params ["_item", "_amount"];
_amount = _x select 1;
_message = _item; _message = _item;
if (isClass(configFile >> "CfgWeapons" >> _item)) then { if (isClass(configFile >> "CfgWeapons" >> _item)) then {
_message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName");
@ -55,18 +55,21 @@ if (_show) then {
}; };
}; };
_triageCardTexts pushback format["%1x - %2", _amount, _message]; _triageCardTexts pushback format["%1x - %2", _amount, _message];
}foreach _log; } foreach _log;
if (count _triageCardTexts == 0) then { if (count _triageCardTexts == 0) then {
_lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry)); _lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry));
}; };
{ {
_lbCtrl lbAdd _x; _lbCtrl lbAdd _x;
}foreach _triageCardTexts; } foreach _triageCardTexts;
_triageStatus = [_target] call FUNC(getTriageStatus); _triageStatus = [_target] call FUNC(getTriageStatus);
(_display displayCtrl 2000) ctrlSetText (_triageStatus select 0);
(_display displayCtrl 2000) ctrlSetBackgroundColor (_triageStatus select 2); _triageStatus params ["_text", "", "_color"];
(_display displayCtrl 2000) ctrlSetText _text;
(_display displayCtrl 2000) ctrlSetBackgroundColor _color;
}, 0, [_target]] call CBA_fnc_addPerFrameHandler; }, 0, [_target]] call CBA_fnc_addPerFrameHandler;

View File

@ -3,18 +3,18 @@
* Display triage card for a unit * Display triage card for a unit
* *
* Arguments: * Arguments:
* 0: The unit <OBJECT> * 0: Show <BOOL>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_show", "_ctrl", "_display", "_idc", "_pos"]; private ["_ctrl", "_display", "_idc", "_pos"];
_show = _this select 0; params ["_show"];
disableSerialization; disableSerialization;
_display = uiNamespace getvariable QGVAR(triageCard); _display = uiNamespace getvariable QGVAR(triageCard);

View File

@ -15,10 +15,9 @@
#define BLOODLOSSRATE_BASIC 0.2 #define BLOODLOSSRATE_BASIC 0.2
private ["_unit", "_totalBloodLoss","_tourniquets","_openWounds", "_cardiacOutput", "_internalWounds"]; private ["_totalBloodLoss","_tourniquets","_openWounds", "_cardiacOutput", "_internalWounds"];
// TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical). // TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical).
params ["_unit"];
_unit = _this select 0;
_totalBloodLoss = 0; _totalBloodLoss = 0;
// Advanced medical bloodloss handling // Advanced medical bloodloss handling
@ -34,16 +33,17 @@ if (GVAR(level) >= 2) then {
// (((BLOODLOSS_SMALL_WOUNDS * (_x select 0))) + ((BLOODLOSS_MEDIUM_WOUNDS * (_x select 1))) + ((BLOODLOSS_LARGE_WOUNDS * (_x select 2))) * (_cardiacOutput / DEFAULT_CARDIAC_OUTPUT)); // (((BLOODLOSS_SMALL_WOUNDS * (_x select 0))) + ((BLOODLOSS_MEDIUM_WOUNDS * (_x select 1))) + ((BLOODLOSS_LARGE_WOUNDS * (_x select 2))) * (_cardiacOutput / DEFAULT_CARDIAC_OUTPUT));
}; };
}foreach _openWounds; } foreach _openWounds;
_internalWounds = _unit getvariable [QGVAR(internalWounds), []]; _internalWounds = _unit getvariable [QGVAR(internalWounds), []];
{ {
_totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3));
}foreach _internalWounds; } foreach _internalWounds;
// cap the blood loss to be no greater as the current cardiac output // cap the blood loss to be no greater as the current cardiac output
//(_totalBloodLoss min _cardiacOutput); //(_totalBloodLoss min _cardiacOutput);
} else { } else {
_totalBloodLoss = BLOODLOSSRATE_BASIC * (damage _unit); { _totalBloodLoss = _totalBloodLoss + _x } forEach (_unit getvariable [QGVAR(bodyPartStatus), []]);
_totalBloodLoss = (_totalBloodLoss / 6) * BLOODLOSSRATE_BASIC;
}; };
_totalBloodLoss * ((_unit getVariable [QGVAR(bleedingCoefficient), GVAR(bleedingCoefficient)]) max 0); _totalBloodLoss * ((_unit getVariable [QGVAR(bleedingCoefficient), GVAR(bleedingCoefficient)]) max 0);

View File

@ -6,29 +6,28 @@
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* *
* ReturnValue: * ReturnValue:
* Blood Pressuret <ARRAY <NUMBER>,<NUMBER>> * 0: BloodPressure Low <NUMBER>
* 1: BloodPressure High <NUMBER>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
/* // Value is taken because with cardic output and resistance at default values, it will put blood pressure High at 120.
Value is taken because with cardic output and resistance at default values, it will put blood pressure High at 120.
*/
#define MODIFIER_BP_HIGH 0.229 #define MODIFIER_BP_HIGH 0.229
/* // Value is taken because with cardic output and resistance at default values, it will put blood pressure Low at 80.
Value is taken because with cardic output and resistance at default values, it will put blood pressure Low at 80.
*/
#define MODIFIER_BP_LOW 0.1524 #define MODIFIER_BP_LOW 0.1524
private ["_unit", "_bloodPressureLow", "_bloodPressureHigh", "_cardiacOutput", "_resistance"]; private ["_bloodPressureLow", "_bloodPressureHigh", "_cardiacOutput", "_resistance"];
_unit = _this select 0;
params ["_unit"];
_cardiacOutput = [_unit] call FUNC(getCardiacOutput); _cardiacOutput = [_unit] call FUNC(getCardiacOutput);
_resistance = _unit getvariable [QGVAR(peripheralResistance), 100]; _resistance = _unit getvariable [QGVAR(peripheralResistance), 100];
_bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance; _bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance;
_bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance; _bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance;
[_bloodPressureLow, _bloodPressureHigh]; [_bloodPressureLow max 0, _bloodPressureHigh max 0]

View File

@ -28,10 +28,8 @@
*/ */
#define BLOOD_CHANGE_PER_SECOND 0.0595 #define BLOOD_CHANGE_PER_SECOND 0.0595
private ["_bloodVolume", "_bloodVolumeChange", "_ivVolume"];
params ["_unit"];
private ["_unit","_bloodVolume","_bloodVolumeChange", "_ivVolume"];
_unit = _this select 0;
_bloodVolume = _unit getvariable [QGVAR(bloodVolume), 100]; _bloodVolume = _unit getvariable [QGVAR(bloodVolume), 100];
_bloodVolumeChange = -([_unit] call FUNC(getBloodLoss)); _bloodVolumeChange = -([_unit] call FUNC(getBloodLoss));
@ -43,13 +41,13 @@ if (_bloodVolume < 100.0) then {
_ivVolume = (_unit getvariable [_x, 0]) + IV_CHANGE_PER_SECOND; _ivVolume = (_unit getvariable [_x, 0]) + IV_CHANGE_PER_SECOND;
_unit setvariable [_x,_ivVolume]; _unit setvariable [_x,_ivVolume];
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
} else { } else {
{ {
if ((_unit getvariable [_x, 0]) > 0) then { if ((_unit getvariable [_x, 0]) > 0) then {
_unit setvariable [_x, 0]; // lets get rid of exessive IV volume _unit setvariable [_x, 0]; // lets get rid of exessive IV volume
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
}; };
_bloodVolumeChange; _bloodVolumeChange;

View File

@ -22,7 +22,6 @@
// to limit the amount of complex calculations necessary, we take a set modifier to calculate Stroke Volume. // to limit the amount of complex calculations necessary, we take a set modifier to calculate Stroke Volume.
#define MODIFIER_CARDIAC_OUTPUT 19.04761 #define MODIFIER_CARDIAC_OUTPUT 19.04761
private "_unit"; params ["_unit"];
_unit = _this select 0;
((_unit getvariable [QGVAR(bloodVolume), 100])/MODIFIER_CARDIAC_OUTPUT) + ((_unit getvariable [QGVAR(heartRate), 80])/80-1); ((_unit getvariable [QGVAR(bloodVolume), 100])/MODIFIER_CARDIAC_OUTPUT) + ((_unit getvariable [QGVAR(heartRate), 80])/80-1);

View File

@ -15,8 +15,9 @@
#define HEART_RATE_MODIFIER 0.02 #define HEART_RATE_MODIFIER 0.02
private ["_unit", "_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_change", "_callBack", "_bloodVolume"]; private ["_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_change", "_callBack", "_bloodVolume"];
_unit = _this select 0; params ["_unit"];
_hrIncrease = 0; _hrIncrease = 0;
if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
_heartRate = _unit getvariable [QGVAR(heartRate), 80]; _heartRate = _unit getvariable [QGVAR(heartRate), 80];
@ -24,10 +25,8 @@ if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
_adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []]; _adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []];
{ {
_values = (_x select 0); _x params ["_values", "_time", "_callBack"];
if (abs _values > 0) then { if (abs _values > 0) then {
_time = (_x select 1);
_callBack = _x select 2;
if (_time <= 0) then { if (_time <= 0) then {
_time = 1; _time = 1;
}; };
@ -47,7 +46,7 @@ if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
[_unit] call _callBack; [_unit] call _callBack;
}; };
}foreach _adjustment; } foreach _adjustment;
_adjustment = _adjustment - [ObjNull]; _adjustment = _adjustment - [ObjNull];
_unit setvariable [QGVAR(heartRateAdjustments), _adjustment]; _unit setvariable [QGVAR(heartRateAdjustments), _adjustment];

View File

@ -6,7 +6,9 @@
* 0: The unit <OBJECT> * 0: The unit <OBJECT>
* *
* Return Value: * Return Value:
* Triage status from the unit. Name, statusID, color <ARRAY <STRING><NUMBER><ARRAY>> * 0: Name <STRING>
* 1: Status ID <NUMBER>
* 2: Color <ARRAY <NUMBER>>
* *
* Public: Yes * Public: Yes
*/ */
@ -14,7 +16,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_return","_status"]; private ["_unit","_return","_status"];
_unit = _this select 0; params ["_unit"];
_status = _unit getvariable [QGVAR(triageLevel), -1]; _status = _unit getvariable [QGVAR(triageLevel), -1];
_return = switch (_status) do { _return = switch (_status) do {
case 1: {[localize LSTRING(Triage_Status_Minor), 1, [0, 0.5, 0, 0.9]]}; case 1: {[localize LSTRING(Triage_Status_Minor), 1, [0, 0.5, 0, 0.9]]};
@ -23,4 +25,4 @@ _return = switch (_status) do {
case 4: {[localize LSTRING(Triage_Status_Deceased), 4, [0, 0, 0, 0.9]]}; case 4: {[localize LSTRING(Triage_Status_Deceased), 4, [0, 0, 0, 0.9]]};
default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]}; default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]};
}; };
_return; _return

View File

@ -13,23 +13,19 @@
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_typeOfProjectile); params ["_typeOfProjectile"];
private ["_typeOfDamage"];
_typeOfDamage = switch (true) do { if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"};
case (_typeOfProjectile isKindOf "BulletBase"): {"bullet"}; if (_typeOfProjectile isKindOf "ShotgunBase") exitwith {"bullet"};
case (_typeOfProjectile isKindOf "GrenadeCore"): {"grenade"}; if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"};
case (_typeOfProjectile isKindOf "TimeBombCore"): {"explosive"}; if (_typeOfProjectile isKindOf "TimeBombCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "MineCore"): {"explosive"}; if (_typeOfProjectile isKindOf "MineCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "FuelExplosion"): {"explosive"}; if (_typeOfProjectile isKindOf "FuelExplosion") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "ShellBase"): {"shell"}; if (_typeOfProjectile isKindOf "ShellBase") exitWith {"shell"};
case (_typeOfProjectile isKindOf "RocketBase"): {"explosive"}; if (_typeOfProjectile isKindOf "RocketBase") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "MissileBase"): {"explosive"}; if (_typeOfProjectile isKindOf "MissileBase") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "LaserBombCore"): {"explosive"}; if (_typeOfProjectile isKindOf "LaserBombCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "BombCore"): {"explosive"}; if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "Grenade"): {"grenade"}; if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"};
default {toLower _typeOfProjectile}; toLower _typeOfProjectile
};
_typeOfDamage

View File

@ -14,7 +14,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_return"]; private ["_unit","_return"];
_unit = _this select 0; params ["_unit"];
if (isnil QGVAR(unconsciousConditions)) then { if (isnil QGVAR(unconsciousConditions)) then {
GVAR(unconsciousConditions) = []; GVAR(unconsciousConditions) = [];
@ -25,6 +25,6 @@ _return = false;
if (typeName _x == typeName {} && {([_unit] call _x)}) exitwith { if (typeName _x == typeName {} && {([_unit] call _x)}) exitwith {
_return = true; _return = true;
}; };
}foreach GVAR(unconsciousConditions); } foreach GVAR(unconsciousConditions);
_return; _return

View File

@ -18,13 +18,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage", "_classID", "_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury", "_bandagedInjury"]; private ["_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury", "_bandagedInjury"];
_target = _this select 0; params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"];
_impact = _this select 1;
_part = _this select 2;
_injuryIndex = _this select 3;
_injury = _this select 4;
_bandage = _this select 5;
_classID = _injury select 1; _classID = _injury select 1;
_className = GVAR(woundClassNames) select _classID; _className = GVAR(woundClassNames) select _classID;
@ -57,8 +52,8 @@ if (isClass (_config >> _className)) then {
}; };
_bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []];
_exist = false;
_injuryType = _injury select 1; _injuryType = _injury select 1;
_exist = false;
_bandagedInjury = []; _bandagedInjury = [];
{ {
if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith {
@ -69,7 +64,7 @@ _bandagedInjury = [];
_bandagedInjury = _existingInjury; _bandagedInjury = _existingInjury;
}; };
}foreach _bandagedWounds; } foreach _bandagedWounds;
if !(_exist) then { if !(_exist) then {
// [ID, classID, bodypart, percentage treated, bloodloss rate] // [ID, classID, bodypart, percentage treated, bloodloss rate]
@ -83,12 +78,8 @@ _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];
if (random(1) <= _reopeningChance) then { if (random(1) <= _reopeningChance) then {
_delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay);
[{ [{
private ["_target", "_impact", "_part", "_injuryIndex", "_bandage", "_injury", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"]; private ["_bandage", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"];
_target = _this select 0; params ["_target", "_impact", "_part", "_injuryIndex", "_injury"];
_impact = _this select 1;
_part = _this select 2;
_injuryIndex = _this select 3;
_injury = _this select 4;
//if (alive _target) then { //if (alive _target) then {
_openWounds = _target getvariable [QGVAR(openWounds), []]; _openWounds = _target getvariable [QGVAR(openWounds), []];
@ -108,7 +99,7 @@ if (random(1) <= _reopeningChance) then {
_existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0];
_bandagedWounds set [_foreachIndex, _existingInjury]; _bandagedWounds set [_foreachIndex, _existingInjury];
}; };
}foreach _bandagedWounds; } foreach _bandagedWounds;
if (_exist) then { if (_exist) then {
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];

View File

@ -1,9 +1,22 @@
//#define DEBUG_MODE_FULL /*
* Author: Glowbal
* handle Litter Create
*
* Arguments:
* 0: Litter Class <STRING>
* 1: Position <ARRAY>
* 2: Unit <OBJECT>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp" #include "script_component.hpp"
if(!hasInterface) exitWith { false }; if(!hasInterface) exitWith { false };
PARAMS_3(_litterClass,_position,_direction); params ["_litterClass", "_position", "_unit"];
private["_litterObject", "_maxLitterCount"]; private["_litterObject", "_maxLitterCount"];
//IGNORE_PRIVATE_WARNING(_values); //IGNORE_PRIVATE_WARNING(_values);
@ -16,7 +29,7 @@ _litterObject = _litterClass createVehicleLocal _position;
_litterObject setDir _direction; _litterObject setDir _direction;
_litterObject setPosATL _position; _litterObject setPosATL _position;
// Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112 // Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112
[{ (_this select 0) setPosATL (_this select 1); }, [_litterObject, _position]] call EFUNC(common,execNextFrame); [{ params ["_object", "_pos"]; _object setPosATL _pos; }, [_litterObject, _position]] call EFUNC(common,execNextFrame);
_maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail); _maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail);
if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then { if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then {
@ -34,10 +47,11 @@ if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then {
GVAR(litterPFHRunning) = true; GVAR(litterPFHRunning) = true;
[{ [{
{ {
if (ACE_time - (_x select 0) >= GVAR(litterCleanUpDelay)) then { _x params ["_time", "_objects"];
if (ACE_time - _time >= GVAR(litterCleanUpDelay)) then {
{ {
deleteVehicle _x; deleteVehicle _x;
} forEach (_x select 1); } forEach _objects;
GVAR(allCreatedLitter) set[_foreachIndex, objNull]; GVAR(allCreatedLitter) set[_foreachIndex, objNull];
}; };
} forEach GVAR(allCreatedLitter); } forEach GVAR(allCreatedLitter);
@ -49,5 +63,3 @@ if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then {
}; };
}, 30, []] call CBA_fnc_addPerFrameHandler; }, 30, []] call CBA_fnc_addPerFrameHandler;
}; };
true

View File

@ -1,5 +1,5 @@
/* /*
* Author: KoffeinFlummi, Glowbal * Author: KoffeinFlummi, Glowbal, commy2
* Main HandleDamage EH function. * Main HandleDamage EH function.
* *
* Arguments: * Arguments:
@ -14,74 +14,79 @@
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"]; params ["_unit", "_selection", "_damage", "_shooter", "_projectile"];
_unit = _this select 0; TRACE_5("ACE_DEBUG: HandleDamage Called",_unit, _selection, _damage, _shooter, _projectile);
_selection = _this select 1;
_damage = _this select 2;
_shooter = _this select 3;
_projectile = _this select 4;
if !(local _unit) exitWith {nil}; // bug, apparently can fire for remote units in special cases
if !(local _unit) exitWith {
TRACE_2("ACE_DEBUG: HandleDamage on remote unit!",_unit, isServer);
nil
};
private ["_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"];
// bug, assumed fixed, @todo excessive testing, if nothing happens remove
if (typeName _projectile == "OBJECT") then { if (typeName _projectile == "OBJECT") then {
_projectile = typeOf _projectile; _projectile = typeOf _projectile;
_this set [4, _projectile]; _this set [4, _projectile];
}; };
// If the damage is being weird, we just tell it to fuck off. TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage,_unit);
if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0};
// If damage is in dummy hitpoints, "hands" and "legs", don't change anything
if (_selection == "hands") exitWith {_unit getHit "hands"};
if (_selection == "legs") exitWith {_unit getHit "legs"};
// If the damage is being weird, we just tell it to fuck off. Ignore: "hands", "legs", "?"
if (_selection != "" && {!(_selection in GVAR(SELECTIONS))}) exitWith {0}; //@todo "neck", "pelvis", "spine1", "spine2", "spine3"
// Exit if we disable damage temporarily // Exit if we disable damage temporarily
_damageOld = damage _unit; if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith {
if (_selection in GVAR(SELECTIONS)) then { TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit,_unit);
_damageOld = _unit getHit _selection; if (_selection == "") then {
damage _unit
} else {
_unit getHit _selection
};
}; };
if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith {_damageOld};
// Get return damage // Get return damage
_damageReturn = _damage; _damageReturn = _damage;
if (GVAR(level) < 2) then {
_damageReturn = _this call FUNC(handleDamage_basic); _newDamage = _this call FUNC(handleDamage_caching);
// handleDamage_caching may have modified the projectile string
_typeOfDamage = [_projectile] call FUNC(getTypeOfDamage);
TRACE_3("ACE_DEBUG: HandleDamage caching new damage",_selection,_newDamage,_unit);
_typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage);
_minLethalDamage = if (_typeIndex >= 0) then {
GVAR(minLethalDamages) select _typeIndex
} else { } else {
if !([_unit] call FUNC(hasMedicalEnabled)) exitwith { 0.01
// Because of the config changes, we cannot properly disable the medical system for a unit. };
// lets use basic for the ACE_time being..
_damageReturn = _this call FUNC(handleDamage_basic);
};
_newDamage = _this call FUNC(handleDamage_caching);
// handleDamage_caching may have modified the projectile string
_projectile = _this select 4;
_typeOfDamage = [_projectile] call FUNC(getTypeOfDamage);
_typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then {
_minLethalDamage = 0.01; if (GVAR(enableVehicleCrashes)) then {
if (_typeIndex >= 0) then { _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS))));
_minLethalDamage = GVAR(minLethalDamages) select _typeIndex;
}; };
};
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then {
if (GVAR(enableVehicleCrashes)) then { if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith {
_selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); _damageReturn = 0.9;
};
}; };
if ([_unit] call FUNC(setDead)) then {
if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { _damageReturn = 1;
if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith {
_damageReturn = 0.9;
};
if ([_unit] call FUNC(setDead)) then {
_damageReturn = 1;
} else {
_damageReturn = _damageReturn min 0.89;
};
} else { } else {
_damageReturn = _damageReturn min 0.89; _damageReturn = _damageReturn min 0.89;
}; };
} else {
_damageReturn = _damageReturn min 0.89;
}; };
[_unit] call FUNC(addToInjuredCollection); [_unit] call FUNC(addToInjuredCollection);
if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith {
@ -123,4 +128,6 @@ if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_dam
0.89; 0.89;
}; };
_damageReturn; TRACE_3("ACE_DEBUG: HandleDamage damage return",_selection,_damageReturn,_unit);
_damageReturn

View File

@ -12,23 +12,16 @@
* 6: Type of Damage <STRING> * 6: Type of Damage <STRING>
* *
* Return Value: * Return Value:
* Nothing * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage", "_part", "_damageBodyParts", "_newDamage", "_hitPoints"]; private ["_typeOfProjectile", "_part", "_damageBodyParts", "_hitPoints"];
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfProjectile", "_newDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfProjectile = _this select 4;
_newDamage = _this select 5;
// Most likely taking exessive fire damage. Lets exit.
if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) exitwith {};
_part = [_selectionName] call FUNC(selectionNameToNumber); _part = [_selectionName] call FUNC(selectionNameToNumber);
if (_part < 0) exitwith {}; if (_part < 0) exitwith {};
@ -40,6 +33,7 @@ _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage];
_unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true];
_typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage);
[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); [_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds);
// TODO Disabled until implemented fully // TODO Disabled until implemented fully

View File

@ -6,23 +6,23 @@
* 0: Unit for which the hitpoint damage will be sorted out <OBJECT> * 0: Unit for which the hitpoint damage will be sorted out <OBJECT>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_unit); params ["_unit"];
if (!local _unit) exitwith {}; if (!local _unit) exitwith {};
private ["_bodyStatus", "_headDamage", "_torsoDamage", "_handsDamage", "_legsDamage"]; private "_bodyStatus";
// ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]
_bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; _bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]];
EXPLODE_6_PVT(_bodyStatus,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); _bodyStatus params ["_headDamage", "_torsoDamage", "_handsDamageR", "_handsDamageL", "_legsDamageR", "_legsDamageL"];
_unit setHitPointDamage ["hitHead", _headDamage min 0.95]; _unit setHitPointDamage ["hitHead", _headDamage min 0.95];
_unit setHitPointDamage ["hitBody", _torsoDamage min 0.95]; _unit setHitPointDamage ["hitBody", _torsoDamage min 0.95];

View File

@ -10,19 +10,15 @@
* 4: Type of the damage done <STRING> * 4: Type of the damage done <STRING>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn"]; private "_bodyPartn";
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfDamage = _this select 4;
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
if (_bodyPartn > 1) exitwith {}; if (_bodyPartn > 1) exitwith {};

View File

@ -1,192 +1,60 @@
/* /*
* Author: KoffeinFlummi * Author: KoffeinFlummi, Glowbal
* Basic HandleDamage EH function. * Handle damage basic medical
* *
* Arguments: * Arguments:
* 0: Unit That Was Hit <OBJECT>
* 1: Name Of Hit Selection <STRING>
* 2: Amount Of Damage <NUMBER>
* 3: Shooter <OBJECT>
* 4: Projectile <STRING>
* 5: Current damage to be returned <NUMBER>
* *
* Return Value: * Return Value:
* Damage To Be Inflicted <NUMBER> * <nil>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
#define LEGDAMAGETRESHOLD1 1 private ["_damageBodyParts", "_cache_params", "_cache_damages"];
#define LEGDAMAGETRESHOLD2 1.7 params ["_target"];
#define ARMDAMAGETRESHOLD1 1 TRACE_1("ACE_DEBUG: HandleDamage_BASIC Called",_target);
#define ARMDAMAGETRESHOLD2 1.7
#define UNCONSCIOUSNESSTRESHOLD 0.7
private ["_unit", "_selectionName", "_damage", "_shooter", "_projectile", "_damage", "_armdamage", "_hitPoint", "_index", "_legdamage", "_newDamage", "_otherDamage", "_pain", "_restore"]; _damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]];
_cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []];
_cache_damages = _target getVariable QGVAR(cachedDamages);
_unit = _this select 0; TRACE_4("ACE_DEBUG: HandleDamage BASIC",_unit, _damageBodyParts,_cache_params,_cache_damages);
_selectionName = _this select 1;
_damage = _this select 2;
_shooter = _this select 3;
_projectile = _this select 4;
// Apply damage treshold / coefficient {
_threshold = [ _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"];
_unit getVariable [QGVAR(damageThreshold), GVAR(AIDamageThreshold)], if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then {
_unit getVariable [QGVAR(damageThreshold), GVAR(playerDamageThreshold)] _part = [_selectionName] call FUNC(selectionNameToNumber);
] select ([_unit] call EFUNC(common,isPlayer)); if (_part < 0) exitwith {};
_damage = _damage * (1 / _threshold);
// This is a new hit, reset variables. private ["_newDamage", "_pain"];
// Note: sometimes handleDamage spans over 2 or even 3 frames. _newDamage = (_cache_damages select _foreachIndex);
if (diag_frameno > (_unit getVariable [QGVAR(basic_frameNo), -3]) + 2) then { _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage];
_unit setVariable [QGVAR(basic_frameNo), diag_frameno]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts];
_unit setVariable [QGVAR(isFalling), false];
_unit setVariable [QGVAR(projectiles), []];
_unit setVariable [QGVAR(hitPoints), []];
_unit setVariable [QGVAR(damages), []];
_unit setVariable [QGVAR(structDamage), 0];
if (isnil {_unit getvariable QGVAR(structDamagePFH)}) then { if (alive _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then {
// Assign orphan structural damage to torso // If it reaches this, we can assume that the hit did not kill this unit, as this function is called 3 frames after the damage has been passed.
[{ if ([_unit, _part, if (_part > 1) then {_newDamage * 1.3} else {_newDamage * 2}] call FUNC(determineIfFatal)) then {
private ["_unit", "_damagesum"]; [_unit, true, 0.5+random(3)] call FUNC(setUnconscious);
_unit = (_this select 0) select 0;
if (ACE_diagTime - (_unit getvariable [QGVAR(structDamagePFH),-2]) >= 2) then {
_unit setVariable [QGVAR(structDamagePFH), nil];
_damagesum = (_unit getHitPointDamage "HitHead") +
(_unit getHitPointDamage "HitBody") +
(_unit getHitPointDamage "HitLeftArm") +
(_unit getHitPointDamage "HitRightArm") +
(_unit getHitPointDamage "HitLeftLeg") +
(_unit getHitPointDamage "HitRightLeg");
if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then {
_unit setHitPointDamage ["HitBody", damage _unit];
};
[(_this select 1)] call cba_fnc_removePerFrameHandler;
}; };
}, 0, [_unit]] call CBA_fnc_addPerFrameHandler;
};
_unit setVariable [QGVAR(structDamagePFH), ACE_diagTime]; // Assign starting ACE_time or reset it
};
_newDamage = _damage - (damage _unit);
if (_selectionName in GVAR(SELECTIONS)) then {
_newDamage = _damage - (_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName)));
};
_damage = _damage - _newDamage;
// Exclude falling damage to everything other than legs and reduce it overall.
if (((velocity _unit) select 2 < -5) and (vehicle _unit == _unit)) then {
_unit setVariable [QGVAR(isFalling), true];
};
if (_unit getVariable [QGVAR(isFalling), false] and !(_selectionName in ["", "leg_l", "leg_r"])) exitWith {
(_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName))) max 0.01;
};
if (_unit getVariable [QGVAR(isFalling), false]) then {
_newDamage = _newDamage * 0.7;
};
// Make sure there's only one damaged selection per projectile per frame.
if (_selectionName != "" and !(_unit getVariable QGVAR(isFalling))) then {
_cache_projectiles = _unit getVariable QGVAR(projectiles);
_cache_hitpoints = _unit getVariable QGVAR(hitPoints);
_cache_damages = _unit getVariable QGVAR(damages);
if (_projectile in _cache_projectiles) then {
_index = _cache_projectiles find _projectile;
_otherDamage = (_cache_damages select _index);
if (_otherDamage > _newDamage) then {
_newDamage = 0;
} else {
_hitPoint = _cache_hitpoints select _index;
_restore = ((_unit getHitPointDamage _hitPoint) - _otherDamage) max 0;
_unit setHitPointDamage [_hitPoint, _restore];
// Make entry unfindable
_cache_projectiles set [_index, objNull];
_cache_projectiles pushBack _projectile;
_cache_hitpoints pushBack (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName));
_cache_damages pushBack _newDamage;
}; };
} else { _pain = _unit getVariable [QGVAR(pain), 0];
_cache_projectiles pushBack _projectile; _pain = _pain + (_newDamage / 4) * (1 - (_unit getVariable [QGVAR(morphine), 0]));
_cache_hitpoints pushBack (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName)); _unit setVariable [QGVAR(pain), _pain min 1, true];
_cache_damages pushBack _newDamage;
}; };
_unit setVariable [QGVAR(projectiles), _cache_projectiles]; }foreach _cache_params;
_unit setVariable [QGVAR(hitPoints), _cache_hitpoints];
_unit setVariable [QGVAR(damages), _cache_damages];
};
// Get rid of double structural damage (seriously arma, what the fuck?) // We broadcast the value across the net here, in order to avoid broadcasting it multiple times earlier in the above code block
if (_selectionName == "") then { _target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true];
_cache_structDamage = _unit getVariable QGVAR(structDamage); TRACE_2("ACE_DEBUG: HandleDamage BASIC Broadcast value here",_unit, _target getvariable QGVAR(bodyPartStatus));
if (_newDamage > _cache_structDamage) then {
_unit setVariable [QGVAR(structDamage), _newDamage];
_newDamage = _newDamage - _cache_structDamage;
} else {
_newDamage = 0;
};
};
if (_selectionName == "") then { EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL);
_damage = _damage + (_unit getVariable QGVAR(structDamage)); _target setHitPointDamage ["hitHead", _headDamage min 0.95];
} else { _target setHitPointDamage ["hitBody", _torsoDamage min 0.95];
_damage = _damage + _newDamage; _target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95];
}; _target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95];
// Leg Damage {
_legdamage = (_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg"); _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95];
if (_selectionName == "leg_l") then { }foreach GVAR(HITPOINTS);
_legdamage = _damage + (_unit getHitPointDamage "HitRightLeg");
};
if (_selectionName == "leg_r") then {
_legdamage = (_unit getHitPointDamage "HitLeftLeg") + _damage;
};
if (_legdamage >= LEGDAMAGETRESHOLD1) then {
_unit setHitPointDamage ["HitLegs", 1];
} else {
_unit setHitPointDamage ["HitLegs", 0];
};
// @todo: force prone for completely fucked up legs.
// Arm Damage
_armdamage = (_unit getHitPointDamage "HitLeftArm") + (_unit getHitPointDamage "HitRightArm");
if (_selectionName == "hand_l") then {
_armdamage = _damage + (_unit getHitPointDamage "HitRightArm");
};
if (_selectionName == "hand_r") then {
_armdamage = (_unit getHitPointDamage "HitLeftArm") + _damage;
};
if (_armdamage >= ARMDAMAGETRESHOLD1) then {
_unit setHitPointDamage ["HitHands", 1];
} else {
_unit setHitPointDamage ["HitHands", 0];
};
// @todo: Drop weapon for full damage.
// Set Pain
if (_selectionName == "") then {
_pain = _unit getVariable [QGVAR(pain), 0];
_pain = _pain + _newDamage * (1 - (_unit getVariable [QGVAR(morphine), 0]));
_unit setVariable [QGVAR(pain), _pain min 1, true];
};
// Unconsciousness
if (_selectionName == "" and
_damage >= UNCONSCIOUSNESSTRESHOLD and
_damage < 1 and
!(_unit getVariable ["ACE_isUnconscious", False]
)) then {
[_unit, true] call FUNC(setUnconscious);
};
_damage

View File

@ -18,13 +18,9 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; private ["_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"];
_unit = _this select 0; params ["_unit", "_selectionName", "_damage", "_source", "_projectile"];
_selectionName = _this select 1; TRACE_8("ACE_DEBUG: HandleDamage_Caching Called",_unit, _selectionName, _damage, _source, _projectile,GVAR(SELECTIONS),GVAR(HITPOINTS),damage _unit);
_damage = _this select 2;
_source = _this select 3;
_projectile = _this select 4;
_hitSelections = GVAR(SELECTIONS); _hitSelections = GVAR(SELECTIONS);
_hitPoints = GVAR(HITPOINTS); _hitPoints = GVAR(HITPOINTS);
@ -78,21 +74,23 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t
// handle the cached damages 3 frames later // handle the cached damages 3 frames later
[{ [{
private ["_args", "_params"]; private ["_args", "_params"];
_args = _this select 0; params ["_args", "_idPFH"];
_args params ["_unit", "_frameno"];
if (diag_frameno > _frameno + 2) then {
_unit setDamage 0;
if (diag_frameno > (_args select 1) + 2) then { if (GVAR(level) < 2 || {!([_unit] call FUNC(hasMedicalEnabled))}) then {
(_args select 0) setDamage 0; [_unit] call FUNC(handleDamage_basic);
} else {
_cache_params = (_args select 0) getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []];
_cache_damages = (_args select 0) getVariable QGVAR(cachedDamages); _cache_damages = _unit getVariable QGVAR(cachedDamages);
{ {
_params = _x + [_cache_damages select _foreachIndex]; _params = _x + [_cache_damages select _foreachIndex];
_params call FUNC(handleDamage_advanced); _params call FUNC(handleDamage_advanced);
}foreach _cache_params; } foreach _cache_params;
[_unit] call FUNC(handleDamage_advancedSetDamage);
[(_args select 0)] call FUNC(handleDamage_advancedSetDamage); };
[_idPFH] call CBA_fnc_removePerFrameHandler;
[(_this select 1)] call cba_fnc_removePerFrameHandler;
}; };
}, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler;
@ -152,4 +150,6 @@ if (_selectionName != "") then {
_unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params];
}; };
_newDamage; TRACE_8("ACE_DEBUG: HandleDamage_Caching",_unit, _newDamage, _cache_params, _cache_damages, _unit getVariable QGVAR(cachedProjectiles), _unit getVariable QGVAR(cachedHitPoints), _unit getVariable QGVAR(cachedDamages), _unit getVariable QGVAR(cachedHandleDamageParams));
_newDamage

View File

@ -17,12 +17,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn", "_fractures", "_fractureType"]; private ["_bodyPartn", "_fractures", "_fractureType"];
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfDamage = _this select 4;
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
_fractureType = 1; _fractureType = 1;

View File

@ -10,19 +10,15 @@
* 4: Type of the damage done <STRING> * 4: Type of the damage done <STRING>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn"]; private "_bodyPartn";
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfDamage = _this select 4;
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
// TODO implement internal injuries // TODO implement internal injuries

View File

@ -10,19 +10,16 @@
* 4: Type of the damage done <STRING> * 4: Type of the damage done <STRING>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"];
_unit = _this select 0; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"];
_selectionName = _this select 1; TRACE_6("ACE_DEBUG: HandleDamage Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage);
_damage = _this select 2;
_typeOfProjectile = _this select 3;
_typeOfDamage = _this select 4;
// Administration for open wounds and ids // Administration for open wounds and ids
_openWounds = _unit getvariable[QGVAR(openWounds), []]; _openWounds = _unit getvariable[QGVAR(openWounds), []];
@ -43,7 +40,7 @@ _foundIndex = -1;
if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith {
_foundIndex = _foreachIndex; _foundIndex = _foreachIndex;
}; };
}foreach _openWounds; } foreach _openWounds;
if (_foundIndex < 0) then { if (_foundIndex < 0) then {
// Since it is a new injury, we will have to add it to the open wounds array to store it // Since it is a new injury, we will have to add it to the open wounds array to store it
@ -53,7 +50,7 @@ _foundIndex = -1;
_injury = _openWounds select _foundIndex; _injury = _openWounds select _foundIndex;
_injury set [3, (_injury select 3) + 1]; _injury set [3, (_injury select 3) + 1];
}; };
}foreach _woundsCreated; } foreach _woundsCreated;
_unit setvariable [QGVAR(openWounds), _openWounds, true]; _unit setvariable [QGVAR(openWounds), _openWounds, true];
@ -64,3 +61,4 @@ if (count _woundsCreated > 0) then {
_painLevel = _unit getvariable [QGVAR(pain), 0]; _painLevel = _unit getvariable [QGVAR(pain), 0];
_unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd];
TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getvariable QGVAR(pain), _unit getvariable QGVAR(openWounds),_woundsCreated);

View File

@ -17,12 +17,9 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"];
_unit = _this select 0; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"];
_selectionName = _this select 1; TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage);
_damage = _this select 2;
_typeOfProjectile = _this select 3;
_typeOfDamage = _this select 4;
// Convert the selectionName to a number and ensure it is a valid selection. // Convert the selectionName to a number and ensure it is a valid selection.
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
@ -70,7 +67,7 @@ _allPossibleInjuries = [];
_allPossibleInjuries pushback _x; _allPossibleInjuries pushback _x;
}; };
}; };
}foreach _allInjuriesForDamageType; } foreach _allInjuriesForDamageType;
// No possible wounds available for this damage type or damage amount. // No possible wounds available for this damage type or damage amount.
if (_highestPossibleSpot < 0) exitwith {}; if (_highestPossibleSpot < 0) exitwith {};
@ -98,7 +95,7 @@ _woundsCreated = [];
if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith {
_foundIndex = _foreachIndex; _foundIndex = _foreachIndex;
}; };
}foreach _openWounds; } foreach _openWounds;
}; };
_injury = []; _injury = [];
@ -123,21 +120,15 @@ _woundsCreated = [];
_painToAdd = _painToAdd + (_toAddInjury select 3); _painToAdd = _painToAdd + (_toAddInjury select 3);
}; };
}; };
}foreach (_injuryTypeInfo select 0); // foreach damage thresholds } foreach (_injuryTypeInfo select 0); // foreach damage thresholds
_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; _unit setvariable [QGVAR(openWounds), _openWounds, true];
// Only update if new wounds have been created // Only update if new wounds have been created
if (count _woundsCreated > 0) then { if (count _woundsCreated > 0) then {
// _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true];
};
if (USE_WOUND_EVENT_SYNC) then {
// Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries.
{
// ["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent);
}foreach _woundsCreated;
}; };
_painLevel = _unit getvariable [QGVAR(pain), 0]; _painLevel = _unit getvariable [QGVAR(pain), 0];
_unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd];
TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getvariable QGVAR(pain), _unit getvariable QGVAR(openWounds),_woundsCreated);

View File

@ -13,8 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private["_unit", "_openWounds"]; private "_openWounds";
_unit = _this select 0; params ["_unit"];
if (!local _unit) exitwith {}; if (!local _unit) exitwith {};
_unit setvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), 0];
@ -22,11 +22,4 @@ if (GVAR(level) >= 2) then {
_unit setvariable [QGVAR(heartRate), 0]; _unit setvariable [QGVAR(heartRate), 0];
_unit setvariable [QGVAR(bloodPressure), [0, 0]]; _unit setvariable [QGVAR(bloodPressure), [0, 0]];
_unit setvariable [QGVAR(airwayStatus), 0]; _unit setvariable [QGVAR(airwayStatus), 0];
if (USE_WOUND_EVENT_SYNC) then {
_openWounds = _unit getvariable [QGVAR(openWounds), []];
{
["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent);
}foreach _openWounds;
};
}; };

View File

@ -15,9 +15,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private["_unit", "_local"]; params ["_unit", "_local"];
_unit = _this select 0;
_local = _this select 1;
if (_local) then { if (_local) then {
if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then { if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then {
[_unit, true] call FUNC(addToInjuredCollection); [_unit, true] call FUNC(addToInjuredCollection);

View File

@ -13,10 +13,9 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood", "_bloodPressureH", "_bloodPressureL", "_interval"]; private ["_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood"];
_unit = _this select 0; params ["_unit", "_interval"];
_interval = _this select 1; TRACE_3("ACE_DEBUG",_unit,_interval,_unit);
if (_interval == 0) exitWith {}; if (_interval == 0) exitWith {};
_lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0]; _lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0];
@ -30,23 +29,28 @@ _bloodVolume = _bloodVolume max 0;
_unit setvariable [QGVAR(bloodVolume), _bloodVolume, _syncValues]; _unit setvariable [QGVAR(bloodVolume), _bloodVolume, _syncValues];
TRACE_3("ACE_DEBUG",_bloodVolume,_syncValues,_unit);
// Set variables for synchronizing information across the net // Set variables for synchronizing information across the net
if (_bloodVolume < 100) then { if (_bloodVolume < 100) then {
if ((_bloodVolume < 90 && (GVAR(level) == 2)) || _bloodVolume <= 45) then { if ((_bloodVolume < 90 && (GVAR(level) == 2)) || _bloodVolume <= 45) then {
TRACE_4("ACE_DEBUG_ADVANCED",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit);
if (_unit getvariable [QGVAR(hasLostBlood), 0] != 2) then { if (_unit getvariable [QGVAR(hasLostBlood), 0] != 2) then {
_unit setvariable [QGVAR(hasLostBlood), 2, true]; _unit setvariable [QGVAR(hasLostBlood), 2, true];
}; };
} else { } else {
TRACE_4("ACE_DEBUG", _bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit);
if (_unit getvariable [QGVAR(hasLostBlood), 0] != 1) then { if (_unit getvariable [QGVAR(hasLostBlood), 0] != 1) then {
_unit setvariable [QGVAR(hasLostBlood), 1, true]; _unit setvariable [QGVAR(hasLostBlood), 1, true];
}; };
} }
} else { } else {
TRACE_4("ACE_DEBUG",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit);
if (_unit getvariable [QGVAR(hasLostBlood), 0] != 0) then { if (_unit getvariable [QGVAR(hasLostBlood), 0] != 0) then {
_unit setvariable [QGVAR(hasLostBlood), 0, true]; _unit setvariable [QGVAR(hasLostBlood), 0, true];
}; };
}; };
TRACE_3("ACE_DEBUG",[_unit] call FUNC(getBloodLoss),_unit getVariable QGVAR(isBleeding),_unit);
if (([_unit] call FUNC(getBloodLoss)) > 0) then { if (([_unit] call FUNC(getBloodLoss)) > 0) then {
if !(_unit getvariable [QGVAR(isBleeding), false]) then { if !(_unit getvariable [QGVAR(isBleeding), false]) then {
_unit setvariable [QGVAR(isBleeding), true, true]; _unit setvariable [QGVAR(isBleeding), true, true];
@ -58,6 +62,7 @@ if (([_unit] call FUNC(getBloodLoss)) > 0) then {
}; };
_painStatus = _unit getvariable [QGVAR(pain), 0]; _painStatus = _unit getvariable [QGVAR(pain), 0];
TRACE_4("ACE_DEBUG",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(painSuppress),_unit);
if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then {
if !(_unit getvariable [QGVAR(hasPain), false]) then { if !(_unit getvariable [QGVAR(hasPain), false]) then {
_unit setvariable [QGVAR(hasPain), true, true]; _unit setvariable [QGVAR(hasPain), true, true];
@ -69,6 +74,7 @@ if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then {
}; };
if (GVAR(level) == 1) then { if (GVAR(level) == 1) then {
TRACE_5("ACE_DEBUG_BASIC_VITALS",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit);
// reduce pain // reduce pain
if (_painStatus > 0) then { if (_painStatus > 0) then {
_unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues];
@ -91,6 +97,7 @@ if (GVAR(level) == 1) then {
// handle advanced medical, with vitals // handle advanced medical, with vitals
if (GVAR(level) >= 2) then { if (GVAR(level) >= 2) then {
TRACE_6("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_bloodVolume, _unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit);
if (_bloodVolume < 30) exitwith { if (_bloodVolume < 30) exitwith {
[_unit] call FUNC(setDead); [_unit] call FUNC(setDead);
}; };
@ -105,7 +112,7 @@ if (GVAR(level) >= 2) then {
// Set the vitals // Set the vitals
_heartRate = (_unit getvariable [QGVAR(heartRate), 80]) + (([_unit] call FUNC(getHeartRateChange)) * _interval); _heartRate = (_unit getvariable [QGVAR(heartRate), 80]) + (([_unit] call FUNC(getHeartRateChange)) * _interval);
_unit setvariable [QGVAR(heartRate), _heartRate, _syncValues]; _unit setvariable [QGVAR(heartRate), _heartRate max 0, _syncValues];
_bloodPressure = [_unit] call FUNC(getBloodPressure); _bloodPressure = [_unit] call FUNC(getBloodPressure);
_unit setvariable [QGVAR(bloodPressure), _bloodPressure, _syncValues]; _unit setvariable [QGVAR(bloodPressure), _bloodPressure, _syncValues];
@ -114,7 +121,7 @@ if (GVAR(level) >= 2) then {
_painReduce = if (_painStatus > 5) then {0.002} else {0.001}; _painReduce = if (_painStatus > 5) then {0.002} else {0.001};
_unit setVariable [QGVAR(pain), (_painStatus - _painReduce * _interval) max 0, _syncValues]; _unit setVariable [QGVAR(pain), (_painStatus - _painReduce * _interval) max 0, _syncValues];
}; };
TRACE_8("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_painReduce,_heartRate,_bloodVolume,_bloodPressure,_interval,_syncValues,_unit);
// TODO Disabled until implemented fully // TODO Disabled until implemented fully
// Handle airway // Handle airway
/*if (GVAR(setting_allowAirwayInjuries)) then { /*if (GVAR(setting_allowAirwayInjuries)) then {
@ -140,8 +147,7 @@ if (GVAR(level) >= 2) then {
// Check vitals for medical status // Check vitals for medical status
// TODO check for in revive state instead of variable // TODO check for in revive state instead of variable
_bloodPressureL = _bloodPressure select 0; _bloodPressure params ["_bloodPressureL", "_bloodPressureH"];
_bloodPressureH = _bloodPressure select 1;
if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then { if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then {
@ -174,12 +180,13 @@ if (GVAR(level) >= 2) then {
// syncing any remaining values // syncing any remaining values
if (_syncValues) then { if (_syncValues) then {
TRACE_3("ACE_DEBUG_IVBAGS_SYNC",GVAR(IVBags),_syncValues,_unit);
{ {
private "_value"; private "_value";
_value = _unit getvariable _x; _value = _unit getvariable _x;
if !(isnil "_value") then { if !(isnil "_value") then {
_unit setvariable [_x,(_unit getvariable [_x, 0]), true]; _unit setvariable [_x,(_unit getvariable [_x, 0]), true];
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
}; };
}; };

View File

@ -16,19 +16,17 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_medic", "_patient", "_item", "_return", "_crew"]; private ["_medic", "_patient", "_item", "_return", "_crew"];
_medic = _this select 0; params ["_medic", "_patient", "_item"];
_patient = _this select 1;
_item = _this select 2;
if (isnil QGVAR(setting_allowSharedEquipment)) then { if (isnil QGVAR(setting_allowSharedEquipment)) then {
GVAR(setting_allowSharedEquipment) = true; GVAR(setting_allowSharedEquipment) = true;
}; };
if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitwith { if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitwith {
true; true
}; };
if ([_medic, _item] call EFUNC(common,hasItem)) exitwith { if ([_medic, _item] call EFUNC(common,hasItem)) exitwith {
true; true
}; };
_return = false; _return = false;
@ -38,7 +36,7 @@ if ((vehicle _medic != _medic) && {[vehicle _medic] call FUNC(isMedicalVehicle)}
if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitwith { if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitwith {
_return = true; _return = true;
}; };
}foreach _crew; } foreach _crew;
}; };
_return; _return

View File

@ -16,9 +16,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_medic", "_patient", "_items", "_return"]; private ["_medic", "_patient", "_items", "_return"];
_medic = _this select 0; params ["_medic", "_patient", "_items"];
_patient = _this select 1;
_items = _this select 2;
_return = true; _return = true;
{ {
@ -31,4 +29,4 @@ _return = true;
}; };
}foreach _items; }foreach _items;
_return; _return

View File

@ -1,21 +1,27 @@
/**
* fn_hasMedicalEnabled.sqf
* @Descr: Check if unit has CMS enabled.
* @Author: Glowbal
*
* @Arguments: [unit OBJECT]
* @Return: BOOL
* @PublicAPI: true
*/
/*
* Author: Glowbal
* Check if unit has CMS enabled
*
* Arguments:
* 0: unit <OBJECT>
*
* Return Value:
* enabled <BOOL>
*
* Example:
* [Unit] call ace_medical_fnc_hasMedicalEnabled
*
* Public: No
*/
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_medicalEnabled"]; private "_medicalEnabled";
_unit = _this select 0; params ["_unit"];
_medicalEnabled = _unit getvariable QGVAR(enableMedical); _medicalEnabled = _unit getvariable QGVAR(enableMedical);
if (isnil "_medicalEnabled") exitwith { if (isnil "_medicalEnabled") exitwith {
(((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getvariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1) || GVAR(level) == 1); (((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getvariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1) || GVAR(level) == 1)
}; };
_medicalEnabled; _medicalEnabled

View File

@ -14,8 +14,6 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_selectionName"]; params ["_target", "_selectionName"];
_target = _this select 0;
_selectionName = _this select 1;
(((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0); (((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0);

View File

@ -1,5 +1,5 @@
/* /*
* Author: KoffeinFlummi * Author: KoffeinFlummi, commy2
* Initializes unit variables. * Initializes unit variables.
* *
* Arguments: * Arguments:
@ -10,17 +10,17 @@
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_allUsedMedication", "_logs"]; params ["_unit"];
_unit = _this select 0;
// basic
_unit setVariable [QGVAR(pain), 0, true]; _unit setVariable [QGVAR(pain), 0, true];
_unit setVariable [QGVAR(morphine), 0, true]; _unit setVariable [QGVAR(morphine), 0, true];
_unit setVariable [QGVAR(bloodVolume), 100, true]; _unit setVariable [QGVAR(bloodVolume), 100, true];
_unit setVariable ["ACE_isUnconscious", false, true];
// advanced
// tourniquets // tourniquets
_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true];
@ -59,13 +59,14 @@ _unit setvariable [QGVAR(airwayCollapsed), false];
// generic medical admin // generic medical admin
_unit setvariable [QGVAR(addedToUnitLoop), false, true]; _unit setvariable [QGVAR(addedToUnitLoop), false, true];
_unit setvariable [QGVAR(inCardiacArrest), false, true]; _unit setvariable [QGVAR(inCardiacArrest), false, true];
_unit setVariable ["ACE_isUnconscious", false, true];
_unit setvariable [QGVAR(hasLostBlood), 0, true]; _unit setvariable [QGVAR(hasLostBlood), 0, true];
_unit setvariable [QGVAR(isBleeding), false, true]; _unit setvariable [QGVAR(isBleeding), false, true];
_unit setvariable [QGVAR(hasPain), false, true]; _unit setvariable [QGVAR(hasPain), false, true];
_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; _unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true];
_unit setvariable [QGVAR(painSuppress), 0, true]; _unit setvariable [QGVAR(painSuppress), 0, true];
private ["_allUsedMedication", "_logs"];
// medication // medication
_allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []];
{ {

View File

@ -15,7 +15,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_target); params ["_target"];
private "_owner"; private "_owner";

View File

@ -15,7 +15,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_target); params ["_target"];
private "_owner"; private "_owner";

View File

@ -13,8 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_eyePos","_objects","_isInBuilding","_medicalFacility"]; private ["_eyePos", "_objects", "_isInBuilding", "_medicalFacility"];
_unit = _this select 0; params ["_unit"];
_eyePos = eyePos _unit; _eyePos = eyePos _unit;
_isInBuilding = false; _isInBuilding = false;
@ -42,13 +42,13 @@ _objects = (lineIntersectsWith [_unit modelToWorldVisual [0, 0, (_eyePos select
if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith { if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith {
_isInBuilding = true; _isInBuilding = true;
}; };
}foreach _objects; } foreach _objects;
if (!_isInBuilding) then { if (!_isInBuilding) then {
_objects = position _unit nearObjects 7.5; _objects = position _unit nearObjects 7.5;
{ {
if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith { if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith {
_isInBuilding = true; _isInBuilding = true;
}; };
}foreach _objects; } foreach _objects;
}; };
_isInBuilding; _isInBuilding;

View File

@ -13,9 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_vehicle"]; private ["_vehicle"];
params ["_unit"];
_unit = _this select 0;
_vehicle = vehicle _unit; _vehicle = vehicle _unit;
if (_unit == _vehicle) exitWith {false}; if (_unit == _vehicle) exitWith {false};

View File

@ -13,8 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; private ["_openWounds", "_openWounds"];
_unit = _this select 0; params ["_unit"];
if (GVAR(level) <= 1) exitwith { if (GVAR(level) <= 1) exitwith {
([_unit] call FUNC(getBloodloss)) == 0; ([_unit] call FUNC(getBloodloss)) == 0;
@ -25,6 +25,6 @@ _openWounds = _unit getvariable [QGVAR(openWounds), []];
{ {
// total bleeding ratio * percentage of injury left // total bleeding ratio * percentage of injury left
_totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3));
}foreach _openWounds; } foreach _openWounds;
(_totalBloodLoss == 0); (_totalBloodLoss == 0);

View File

@ -4,7 +4,7 @@
* *
* Arguments: * Arguments:
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* 1: Class <NUMBER> <OPTIONAL> * 1: Class <NUMBER> (default: 1)
* *
* ReturnValue: * ReturnValue:
* Is in of medic class <BOOL> * Is in of medic class <BOOL>
@ -15,8 +15,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_class", "_medicN"]; private ["_unit", "_class", "_medicN"];
_unit = _this select 0; params ["_unit", ["_medicN", 1]];
_medicN = if (count _this > 1) then {_this select 1} else {1};
_class = _unit getVariable [QGVAR(medicClass), _class = _unit getVariable [QGVAR(medicClass),
getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "attendant")]; getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "attendant")];

View File

@ -12,7 +12,6 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_vehicle"]; params ["_vehicle"];
_vehicle = _this select 0;
(_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 (_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0

View File

@ -6,15 +6,14 @@
* 0: The unit <OBJECT> * 0: The unit <OBJECT>
* *
* ReturnValue: * ReturnValue:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; params ["_unit"];
_unit = _this select 0;
while {({_x == "FirstAidKit"} count items _unit) > 0} do { while {({_x == "FirstAidKit"} count items _unit) > 0} do {
_unit removeItem "FirstAidKit"; _unit removeItem "FirstAidKit";

View File

@ -10,17 +10,18 @@
* 3: The action to modify <OBJECT> * 3: The action to modify <OBJECT>
* *
* ReturnValue: * ReturnValue:
* nil * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
EXPLODE_4_PVT(_this,_target,_player,_selectionN,_actionData); params ["_target", "_player", "_selectionN", "_actionData"];
if (GVAR(level) < 2) exitwith { if (GVAR(level) < 2) exitwith {
private ["_pointDamage"]; private ["_pointDamage"];
_pointDamage = _target getHitPointDamage (["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] select _selectionN); _pointDamage = (_target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]) select _selectionN;
if (_pointDamage >= 0.8) exitWith { if (_pointDamage >= 0.8) exitWith {
_actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))];
@ -33,8 +34,8 @@ if (GVAR(level) < 2) exitwith {
private ["_openWounds", "_amountOf"]; private ["_openWounds", "_amountOf"];
_openWounds = _target getvariable [QGVAR(openWounds), []]; _openWounds = _target getvariable [QGVAR(openWounds), []];
{ {
_amountOf = _x select 3; _x params ["", "", "_selectionX", "_amountOf", "_x4"];
if (_amountOf > 0 && {(_selectionN == (_x select 2))} && {(_x select 4) > 0}) exitwith { if (_amountOf > 0 && {(_selectionN == _selectionX)} && {_x4 > 0}) exitwith {
_actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))];
}; };
} foreach _openWounds; } foreach _openWounds;

View File

@ -8,17 +8,14 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic", "_units", "_activated"]; params ["_logic", "_units", "_activated"];
_logic = _this select 0;
_units = _this select 1;
_activated = _this select 2;
if !(_activated) exitWith {}; if !(_activated) exitWith {};

View File

@ -8,15 +8,15 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic","_setting","_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"]; private ["_setting", "_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"];
_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; params [["_logic", objNull, [objNull]]];
if (!isNull _logic) then { if (!isNull _logic) then {
_list = _logic getvariable ["EnableList",""]; _list = _logic getvariable ["EnableList",""];
@ -32,7 +32,7 @@ if (!isNull _logic) then {
_nilCheckPassedList = _nilCheckPassedList + ","+ _x; _nilCheckPassedList = _nilCheckPassedList + ","+ _x;
}; };
}; };
}foreach _splittedList; } foreach _splittedList;
_list = "[" + _nilCheckPassedList + "]"; _list = "[" + _nilCheckPassedList + "]";
_parsedList = [] call compile _list; _parsedList = [] call compile _list;
@ -47,7 +47,7 @@ if (!isNull _logic) then {
}; };
}; };
}; };
}foreach _objects; } foreach _objects;
}; };
{ {
if (!isnil "_x") then { if (!isnil "_x") then {
@ -57,7 +57,5 @@ if (!isNull _logic) then {
}; };
}; };
}; };
}foreach _parsedList; } foreach _parsedList;
}; };
true

View File

@ -8,15 +8,15 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic","_setting","_objects"]; private ["_setting", "_objects"];
_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; params [["_logic", objNull, [objNull]]];
if (!isNull _logic) then { if (!isNull _logic) then {
_setting = _logic getvariable ["class",0]; _setting = _logic getvariable ["class",0];
_objects = synchronizedObjects _logic; _objects = synchronizedObjects _logic;
@ -24,7 +24,7 @@ if (!isNull _logic) then {
if (local _x) then { if (local _x) then {
_x setvariable[QGVAR(isMedicalFacility), true, true]; _x setvariable[QGVAR(isMedicalFacility), true, true];
}; };
}foreach _objects; } foreach _objects;
}; };
true; true;

View File

@ -8,7 +8,7 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
@ -16,8 +16,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic","_setting","_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"]; private ["_setting", "_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"];
_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; params [["_logic", objNull, [objNull]]];
if (!isNull _logic) then { if (!isNull _logic) then {
_list = _logic getvariable ["EnableList",""]; _list = _logic getvariable ["EnableList",""];
@ -33,7 +33,7 @@ if (!isNull _logic) then {
_nilCheckPassedList = _nilCheckPassedList + ","+ _x; _nilCheckPassedList = _nilCheckPassedList + ","+ _x;
}; };
}; };
}foreach _splittedList; } foreach _splittedList;
_list = "[" + _nilCheckPassedList + "]"; _list = "[" + _nilCheckPassedList + "]";
_parsedList = [] call compile _list; _parsedList = [] call compile _list;
@ -48,7 +48,7 @@ if (!isNull _logic) then {
}; };
}; };
}; };
}foreach _objects; } foreach _objects;
}; };
{ {
if (!isnil "_x") then { if (!isnil "_x") then {
@ -58,7 +58,5 @@ if (!isNull _logic) then {
}; };
}; };
}; };
}foreach _parsedList; } foreach _parsedList;
}; };
true;

View File

@ -8,17 +8,14 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic", "_units", "_activated"]; params ["_logic", "_units", "_activated"];
_logic = _this select 0;
_units = _this select 1;
_activated = _this select 2;
if !(_activated) exitWith {}; if !(_activated) exitWith {};

View File

@ -8,17 +8,14 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic", "_units", "_activated"]; params ["_logic", "_units", "_activated"];
_logic = _this select 0;
_units = _this select 1;
_activated = _this select 2;
if !(_activated) exitWith {}; if !(_activated) exitWith {};

View File

@ -11,28 +11,21 @@
* 5: Incompatable medication <ARRAY<STRING>> * 5: Incompatable medication <ARRAY<STRING>>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_foundEntry", "_allUsedMedication","_allMedsFromClassname", "_usedMeds", "_hasOverDosed", "_med", "_limit", "_classNamesUsed", "_decreaseAmount", "_viscosityChange", "_viscosityAdjustment", "_medicationConfig", "_onOverDose", "_painReduce"]; private ["_foundEntry", "_allUsedMedication","_allMedsFromClassname", "_usedMeds", "_hasOverDosed", "_med", "_limit", "_decreaseAmount", "_viscosityAdjustment", "_medicationConfig", "_onOverDose"];
_target = _this select 0; params ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_viscosityChange", "_painReduce"];
_className = _this select 1;
_variable = _this select 2;
_maxDosage = _this select 3;
_timeInSystem = _this select 4;
_incompatabileMeds = _this select 5;
_viscosityChange = _this select 6;
_painReduce = _this select 7;
_foundEntry = false; _foundEntry = false;
_allUsedMedication = _target getvariable [QGVAR(allUsedMedication), []]; _allUsedMedication = _target getvariable [QGVAR(allUsedMedication), []];
{ {
if (_x select 0 == _variable) exitwith { _x params ["_variableX", "_allMedsFromClassname"];
_allMedsFromClassname = _x select 1; if (_variableX== _variable) exitwith {
if !(_className in _allMedsFromClassname) then { if !(_className in _allMedsFromClassname) then {
_allMedsFromClassname pushback _className; _allMedsFromClassname pushback _className;
_x set [1, _allMedsFromClassname]; _x set [1, _allMedsFromClassname];
@ -56,15 +49,14 @@ if (_usedMeds >= floor (_maxDosage + round(random(2))) && _maxDosage >= 1 && GVA
_hasOverDosed = 0; _hasOverDosed = 0;
{ {
_med = _x select 0; _x params ["_med", "_limit"];
_limit = _x select 1;
{ {
_classNamesUsed = _x select 1; _x params ["", "_classNamesUsed"];
if ({_x == _med} count _classNamesUsed > _limit) then { if ({_x == _med} count _classNamesUsed > _limit) then {
_hasOverDosed = _hasOverDosed + 1; _hasOverDosed = _hasOverDosed + 1;
}; };
}foreach _allUsedMedication; } foreach _allUsedMedication;
}foreach _incompatabileMeds; } foreach _incompatabileMeds;
if (_hasOverDosed > 0 && GVAR(enableOverdosing)) then { if (_hasOverDosed > 0 && GVAR(enableOverdosing)) then {
_medicationConfig = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Medication"); _medicationConfig = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Medication");
@ -85,16 +77,9 @@ _decreaseAmount = 1 / _timeInSystem;
_viscosityAdjustment = _viscosityChange / _timeInSystem; _viscosityAdjustment = _viscosityChange / _timeInSystem;
[{ [{
private ["_args", "_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_usedMeds", "_viscosityAdjustment", "_painReduce"]; params ["_args", "_idPFH"];
_args = _this select 0; _args params ["_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_viscosityAdjustment", "_painReduce"];
_target = _args select 0; private "_usedMeds";
_timeInSystem = _args select 1;
_variable = _args select 2;
_amountDecreased = _args select 3;
_decreaseAmount = _args select 4;
_viscosityAdjustment = _args select 5;
_painReduce = _args select 6;
_usedMeds = _target getvariable [_variable, 0]; _usedMeds = _target getvariable [_variable, 0];
_usedMeds = _usedMeds - _decreaseAmount; _usedMeds = _usedMeds - _decreaseAmount;
_target setvariable [_variable, _usedMeds]; _target setvariable [_variable, _usedMeds];
@ -106,7 +91,7 @@ _viscosityAdjustment = _viscosityChange / _timeInSystem;
_target setvariable [QGVAR(painSuppress), ((_target getvariable [QGVAR(painSuppress), 0]) - _painReduce) max 0]; _target setvariable [QGVAR(painSuppress), ((_target getvariable [QGVAR(painSuppress), 0]) - _painReduce) max 0];
if (_amountDecreased >= 1 || (_usedMeds <= 0) || !alive _target) then { if (_amountDecreased >= 1 || (_usedMeds <= 0) || !alive _target) then {
[(_this select 1)] call cba_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
_args set [3, _amountDecreased]; _args set [3, _amountDecreased];
}, 1, [_target, _timeInSystem, _variable, 0, _decreaseAmount, _viscosityAdjustment, _painReduce / _timeInSystem] ] call CBA_fnc_addPerFrameHandler; }, 1, [_target, _timeInSystem, _variable, 0, _decreaseAmount, _viscosityAdjustment, _painReduce / _timeInSystem] ] call CBA_fnc_addPerFrameHandler;

View File

@ -7,7 +7,7 @@
* 1: injury <ARRAY> * 1: injury <ARRAY>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
@ -15,8 +15,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_injury", "_openWounds", "_injuryID", "_exists"]; private ["_unit", "_injury", "_openWounds", "_injuryID", "_exists"];
_unit = _this select 0; params ["_unit", "_injury"];
_injury = _this select 1;
if (!local _unit) then { if (!local _unit) then {
_openWounds = _unit getvariable[QGVAR(openWounds), []]; _openWounds = _unit getvariable[QGVAR(openWounds), []];
@ -28,7 +27,7 @@ if (!local _unit) then {
_exists = true; _exists = true;
_openWounds set [_foreachIndex, _injury]; _openWounds set [_foreachIndex, _injury];
}; };
}foreach _openWounds; } foreach _openWounds;
if (!_exists) then { if (!_exists) then {
_openWounds pushback _injury; _openWounds pushback _injury;

View File

@ -7,19 +7,18 @@
* 1: Origin object <OBJECT> * 1: Origin object <OBJECT>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_openWounds", "_originOfrequest"]; private ["_unit", "_openWounds", "_originOfrequest"];
_unit = _this select 0; params ["_unit", "_originOfrequest"];
_originOfrequest = _this select 1;
if (local _unit && !(local _originOfrequest)) then { if (local _unit && !(local _originOfrequest)) then {
_openWounds = _unit getvariable [QGVAR(openWounds), []]; _openWounds = _unit getvariable [QGVAR(openWounds), []];
{ {
["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent); ["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent);
}foreach _openWounds; } foreach _openWounds;
}; };

View File

@ -3,13 +3,12 @@
* Parse the ACE_Medical_Advanced config for all injury types. * Parse the ACE_Medical_Advanced config for all injury types.
* *
* Arguments: * Arguments:
* * None
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_injuriesRootConfig", "_woundsConfig", "_allWoundClasses", "_amountOf", "_entry","_classType", "_selections", "_bloodLoss", "_pain","_minDamage","_causes", "_damageTypesConfig", "_thresholds", "_typeThresholds", "_selectionSpecific", "_selectionSpecificType", "_classDisplayName", "_subClassDisplayName", "_maxDamage", "_subClassmaxDamage", "_defaultMinLethalDamage", "_minLethalDamage", "_allFoundDamageTypes", "_classID", "_configDamageTypes", "_i", "_parseForSubClassWounds", "_subClass", "_subClassConfig", "_subClassbloodLoss", "_subClasscauses", "_subClassminDamage", "_subClasspain", "_subClassselections", "_subClasstype", "_type", "_varName", "_woundTypes"]; private ["_injuriesRootConfig", "_woundsConfig", "_allWoundClasses", "_amountOf", "_entry","_classType", "_selections", "_bloodLoss", "_pain","_minDamage","_causes", "_damageTypesConfig", "_thresholds", "_typeThresholds", "_selectionSpecific", "_selectionSpecificType", "_classDisplayName", "_subClassDisplayName", "_maxDamage", "_subClassmaxDamage", "_defaultMinLethalDamage", "_minLethalDamage", "_allFoundDamageTypes", "_classID", "_configDamageTypes", "_i", "_parseForSubClassWounds", "_subClass", "_subClassConfig", "_subClassbloodLoss", "_subClasscauses", "_subClassminDamage", "_subClasspain", "_subClassselections", "_subClasstype", "_type", "_varName", "_woundTypes"];
@ -110,7 +109,7 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific");
if (_type in (_x select 5)) then { if (_type in (_x select 5)) then {
_woundTypes pushback _x; _woundTypes pushback _x;
}; };
}foreach _allWoundClasses; } foreach _allWoundClasses;
_typeThresholds = _thresholds; _typeThresholds = _thresholds;
_selectionSpecificType = _selectionSpecific; _selectionSpecificType = _selectionSpecific;
if (isClass(_damageTypesConfig >> _x)) then { if (isClass(_damageTypesConfig >> _x)) then {
@ -130,11 +129,11 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific");
_minDamageThresholds = _minDamageThresholds + ":"; _minDamageThresholds = _minDamageThresholds + ":";
_amountThresholds = _amountThresholds + ":"; _amountThresholds = _amountThresholds + ":";
}; };
}foreach _typeThresholds; } foreach _typeThresholds;
"ace_medical" callExtension format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _foreachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; "ace_medical" callExtension format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _foreachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType];
}foreach _allFoundDamageTypes; } foreach _allFoundDamageTypes;
// Extension loading // Extension loading
@ -142,34 +141,30 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific");
{ {
private ["_classID", "_className", "_allowedSelections", "_bloodLoss", "_pain", "_minDamage", "_maxDamage", "_causes", "_classDisplayName", "_extensionInput", "_selections", "_causesArray"]; private ["_classID", "_className", "_allowedSelections", "_bloodLoss", "_pain", "_minDamage", "_maxDamage", "_causes", "_classDisplayName", "_extensionInput", "_selections", "_causesArray"];
// add shit to addInjuryType // add shit to addInjuryType
_classID = _x select 0; _x params ["_classID", "_selections", "_bloodLoss", "_pain", "_damage", "_causesArray", "_classDisplayName"];
_damage params ["_minDamage", "_maxDamage"];
_className = GVAR(woundClassNames) select _forEachIndex; _className = GVAR(woundClassNames) select _forEachIndex;
_allowedSelections = ""; _allowedSelections = "";
_selections = _x select 1;
{ {
_allowedSelections = _allowedSelections + _x; _allowedSelections = _allowedSelections + _x;
if (_forEachIndex < (count _selections) - 1) then { if (_forEachIndex < (count _selections) - 1) then {
_allowedSelections = _allowedSelections + ":"; _allowedSelections = _allowedSelections + ":";
}; };
}foreach _selections; } foreach _selections;
_bloodLoss = _x select 2;
_pain = _x select 3;
_minDamage = (_x select 4) select 0;
_maxDamage = (_x select 4) select 1;
_causes = ""; _causes = "";
_causesArray = (_x select 5);
{ {
_causes = _causes + _x; _causes = _causes + _x;
if (_forEachIndex < (count _causesArray) - 1) then { if (_forEachIndex < (count _causesArray) - 1) then {
_causes = _causes + ":"; _causes = _causes + ":";
}; };
}foreach _causesArray; } foreach _causesArray;
_classDisplayName = _x select 6; _classDisplayName = _x select 6;
"ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; "ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName];
}foreach _allWoundClasses; } foreach _allWoundClasses;
"ace_medical" callExtension "ConfigComplete"; "ace_medical" callExtension "ConfigComplete";

View File

@ -6,9 +6,10 @@
* *
* Arguments: * Arguments:
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* 1: Amount of Pain <NUMBER>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: No * Public: No
*/ */
@ -16,8 +17,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_availableSounds_A","_availableSounds_B","_availableSounds_C","_sound", "_pain"]; private ["_unit","_availableSounds_A","_availableSounds_B","_availableSounds_C","_sound", "_pain"];
_unit = _this select 0; params ["_unit", "_pain"];
_pain = _this select 1;
if (!local _unit || !GVAR(enableScreams)) exitwith{}; if (!local _unit || !GVAR(enableScreams)) exitwith{};
// Lock if the unit is already playing a sound. // Lock if the unit is already playing a sound.

View File

@ -7,16 +7,14 @@
* 1: object belonging to the caller <OBJECT> * 1: object belonging to the caller <OBJECT>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private [ "_target", "_caller"]; params [ "_target", "_caller"];
_target = _this select 0;
_caller = _this select 1;
if (local _target || GVAR(level) < 2) exitwith {}; // if the target is local, we already got the most update to date information if (local _target || GVAR(level) < 2) exitwith {}; // if the target is local, we already got the most update to date information
if (_target getvariable [QGVAR(isWoundSynced), false]) exitwith {}; if (_target getvariable [QGVAR(isWoundSynced), false]) exitwith {};

View File

@ -7,15 +7,15 @@
* 0: The unit that will be put in cardiac arrest state <OBJECT> * 0: The unit that will be put in cardiac arrest state <OBJECT>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: yes * Public: yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_timeInCardiacArrest"]; private "_timeInCardiacArrest";
_unit = _this select 0; params ["_unit"];
if (_unit getvariable [QGVAR(inCardiacArrest),false]) exitwith {}; if (_unit getvariable [QGVAR(inCardiacArrest),false]) exitwith {};
_unit setvariable [QGVAR(inCardiacArrest), true,true]; _unit setvariable [QGVAR(inCardiacArrest), true,true];
@ -28,20 +28,17 @@ _timeInCardiacArrest = 120 + round(random(600));
[{ [{
private ["_args","_unit","_startTime","_timeInCardiacArrest","_heartRate"]; private ["_args","_unit","_startTime","_timeInCardiacArrest","_heartRate"];
_args = _this select 0; params ["_args", "_idPFH"];
_unit = _args select 0; _args params ["_unit", "_startTime", "_timeInCardiacArrest"];
_startTime = _args select 1;
_timeInCardiacArrest = _args select 2;
_heartRate = _unit getvariable [QGVAR(heartRate), 80]; _heartRate = _unit getvariable [QGVAR(heartRate), 80];
if (_heartRate > 0 || !alive _unit) exitwith { if (_heartRate > 0 || !alive _unit) exitwith {
[(_this select 1)] call cba_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
_unit setvariable [QGVAR(inCardiacArrest), nil,true]; _unit setvariable [QGVAR(inCardiacArrest), nil,true];
}; };
if (ACE_time - _startTime >= _timeInCardiacArrest) exitwith { if (ACE_time - _startTime >= _timeInCardiacArrest) exitwith {
[(_this select 1)] call cba_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
_unit setvariable [QGVAR(inCardiacArrest), nil,true]; _unit setvariable [QGVAR(inCardiacArrest), nil,true];
[_unit] call FUNC(setDead); [_unit] call FUNC(setDead);
}; };
}, 1, [_unit, ACE_time, _timeInCardiacArrest] ] call CBA_fnc_addPerFrameHandler; }, 1, [_unit, ACE_time, _timeInCardiacArrest] ] call CBA_fnc_addPerFrameHandler;

View File

@ -6,7 +6,7 @@
* 0: The unit that will be killed <OBJECT> * 0: The unit that will be killed <OBJECT>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: yes * Public: yes
*/ */
@ -14,11 +14,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_force", "_reviveVal", "_lifesLeft"]; private ["_unit", "_force", "_reviveVal", "_lifesLeft"];
_unit = _this select 0; params ["_unit", ["_force", false]];
_force = false;
if (count _this >= 2) then {
_force = _this select 1;
};
if (!alive _unit) exitwith{true}; if (!alive _unit) exitwith{true};
if (!local _unit) exitwith { if (!local _unit) exitwith {
@ -44,13 +40,13 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal ==
[_unit, true] call FUNC(setUnconscious); [_unit, true] call FUNC(setUnconscious);
[{ [{
private ["_args","_unit","_startTime"]; private "_startTime";
_args = _this select 0; params ["_args", "_idPFH"];
_unit = _args select 0; _args params ["_unit"];
_startTime = _unit getvariable [QGVAR(reviveStartTime), 0]; _startTime = _unit getvariable [QGVAR(reviveStartTime), 0];
if (GVAR(maxReviveTime) > 0 && {ACE_time - _startTime > GVAR(maxReviveTime)}) exitwith { if (GVAR(maxReviveTime) > 0 && {ACE_time - _startTime > GVAR(maxReviveTime)}) exitwith {
[(_this select 1)] call cba_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
_unit setvariable [QGVAR(inReviveState), nil, true]; _unit setvariable [QGVAR(inReviveState), nil, true];
_unit setvariable [QGVAR(reviveStartTime), nil]; _unit setvariable [QGVAR(reviveStartTime), nil];
[_unit, true] call FUNC(setDead); [_unit, true] call FUNC(setDead);
@ -64,7 +60,7 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal ==
}; };
_unit setvariable [QGVAR(reviveStartTime), nil]; _unit setvariable [QGVAR(reviveStartTime), nil];
[(_this select 1)] call cba_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
if (GVAR(level) >= 2) then { if (GVAR(level) >= 2) then {
if (_unit getvariable [QGVAR(heartRate), 60] > 0) then { if (_unit getvariable [QGVAR(heartRate), 60] > 0) then {

View File

@ -7,10 +7,10 @@
* 0: Unit <OBJECT> * 0: Unit <OBJECT>
* 1: HitPoint <STRING> * 1: HitPoint <STRING>
* 2: Damage <NUMBER> * 2: Damage <NUMBER>
* 3: Disable overall damage adjustment (optional) <BOOL> * 3: Disable overall damage adjustment <BOOL> (default: false)
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
@ -22,10 +22,7 @@
#define ARMDAMAGETRESHOLD2 1.7 #define ARMDAMAGETRESHOLD2 1.7
private ["_unit", "_selection", "_damage", "_selections", "_damages", "_damageOld", "_damageSumOld", "_damageNew", "_damageSumNew", "_damageFinal", "_armdamage", "_legdamage"]; private ["_unit", "_selection", "_damage", "_selections", "_damages", "_damageOld", "_damageSumOld", "_damageNew", "_damageSumNew", "_damageFinal", "_armdamage", "_legdamage"];
params ["_unit", "_selection", "_damage", ["_disabled", false]];
_unit = _this select 0;
_selection = _this select 1;
_damage = _this select 2;
// Unit isn't local, give function to machine where it is. // Unit isn't local, give function to machine where it is.
if !(local _unit) exitWith { if !(local _unit) exitWith {
@ -33,7 +30,7 @@ if !(local _unit) exitWith {
}; };
// Check if overall damage adjustment is disabled // Check if overall damage adjustment is disabled
if (count _this > 3 && {_this select 3}) exitWith { if (_disabled) exitWith {
_unit setHitPointDamage [_selection, _damage]; _unit setHitPointDamage [_selection, _damage];
}; };

View File

@ -4,9 +4,9 @@
* *
* Arguments: * Arguments:
* 0: The unit that will be put in an unconscious state <OBJECT> * 0: The unit that will be put in an unconscious state <OBJECT>
* 1: Set unconsciouns <BOOL> <OPTIONAL> * 1: Set unconsciouns <BOOL> (default: true)
* 2: Minimum unconscious ACE_time <NUMBER> <OPTIONAL> * 2: Minimum unconscious ACE_time <NUMBER> (default: (round(random(10)+5)))
* 3: Force AI Unconscious (skip random death chance) <BOOL> <OPTIONAL> * 3: Force AI Unconscious (skip random death chance) <BOOL> (default: false)
* *
* ReturnValue: * ReturnValue:
* nil * nil
@ -19,13 +19,10 @@
#include "script_component.hpp" #include "script_component.hpp"
#define DEFAULT_DELAY (round(random(10)+5)) #define DEFAULT_DELAY (round(random(10)+5))
private ["_unit", "_set", "_animState", "_originalPos", "_startingTime","_minWaitingTime", "_force", "_isDead"]; private ["_animState", "_originalPos", "_startingTime", "_isDead"];
_unit = _this select 0; params ["_unit", ["_set", true], ["_minWaitingTime", DEFAULT_DELAY], ["_force", false]];
_set = if (count _this > 1) then {_this select 1} else {true};
_minWaitingTime = if (count _this > 2) then {_this select 2} else {DEFAULT_DELAY};
_force = if (count _this > 3) then {_this select 3} else {false};
// No change, fuck off. (why is there no xor?) // No change, fuck off. (why is there no xor?)
if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {}; if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {};
@ -97,8 +94,7 @@ if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
_anim = [_unit] call EFUNC(common,getDeathAnim); _anim = [_unit] call EFUNC(common,getDeathAnim);
[_unit, _anim, 1, true] call EFUNC(common,doAnimation); [_unit, _anim, 1, true] call EFUNC(common,doAnimation);
[{ [{
_unit = _this select 0; params ["_unit", "_anim"];
_anim = _this select 1;
if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then {
[_unit, _anim, 2, true] call EFUNC(common,doAnimation); [_unit, _anim, 2, true] call EFUNC(common,doAnimation);
}; };

View File

@ -16,11 +16,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig", "_patientStateCondition", "_allowedSelections"]; private ["_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig", "_patientStateCondition", "_allowedSelections"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName", "_className"];
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
// If the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine // If the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine
if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith { if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith {
@ -37,6 +34,9 @@ if (GVAR(level) >= 2) then {
}; };
if !(isClass _config) exitwith {false}; if !(isClass _config) exitwith {false};
// Allow self treatment check
if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false};
_medicRequired = if (isNumber (_config >> "requiredMedic")) then { _medicRequired = if (isNumber (_config >> "requiredMedic")) then {
getNumber (_config >> "requiredMedic"); getNumber (_config >> "requiredMedic");
} else { } else {
@ -107,7 +107,7 @@ if ("All" in _locations) then {
}; };
}; };
}; };
}foreach _locations; } foreach _locations;
}; };
if !(_return) exitwith {false}; if !(_return) exitwith {false};

View File

@ -16,12 +16,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_selectionName", "_className", "_items"]; params ["_caller", "_target", "_selectionName", "_className", "_items"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
_items = _this select 4;
if (alive _target && {(_target getvariable [QGVAR(inCardiacArrest), false] || _target getvariable [QGVAR(inReviveState), false])}) then { if (alive _target && {(_target getvariable [QGVAR(inCardiacArrest), false] || _target getvariable [QGVAR(inReviveState), false])}) then {
[[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */

View File

@ -14,9 +14,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target", "_reviveStartTime"]; private "_reviveStartTime";
_caller = _this select 0; param ["_caller","_target"];
_target = _this select 1;
if (_target getvariable [QGVAR(inReviveState), false]) then { if (_target getvariable [QGVAR(inReviveState), false]) then {
_reviveStartTime = _target getvariable [QGVAR(reviveStartTime),0]; _reviveStartTime = _target getvariable [QGVAR(reviveStartTime),0];
@ -25,7 +24,7 @@ if (_target getvariable [QGVAR(inReviveState), false]) then {
}; };
}; };
if ((random 1) >= 0.6) then { if (GVAR(level) > 1 && {(random 1) >= 0.6}) then {
_target setvariable [QGVAR(inCardiacArrest), nil,true]; _target setvariable [QGVAR(inCardiacArrest), nil,true];
_target setvariable [QGVAR(heartRate), 40]; _target setvariable [QGVAR(heartRate), 40];
_target setvariable [QGVAR(bloodPressure), [50,70]]; _target setvariable [QGVAR(bloodPressure), [50,70]];

View File

@ -7,7 +7,8 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* 2: SelectionName <STRING> * 2: SelectionName <STRING>
* 3: Treatment classname <STRING> * 3: Treatment classname <STRING>
* * 4: Item <STRING>
* 5: specific Spot <NUMBER> (default: -1)
* *
* Return Value: * Return Value:
* Succesful treatment started <BOOL> * Succesful treatment started <BOOL>
@ -16,15 +17,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
params ["_caller", "_target", "_selectionName", "_className", "_items", "", ["_specificSpot", -1]];
private ["_caller", "_target", "_selectionName", "_className", "_items", "_specificSpot"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
_items = _this select 4;
_specificSpot = if (count _this > 6) then {_this select 6} else {-1};
if !([_target] call FUNC(hasMedicalEnabled)) exitwith { if !([_target] call FUNC(hasMedicalEnabled)) exitwith {
_this call FUNC(treatmentBasic_bandage); _this call FUNC(treatmentBasic_bandage);

View File

@ -15,19 +15,16 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_specificClass", "_classID", "_effectivenessFound", "_className", "_hitPoints", "_hitSelections", "_point", "_woundTreatmentConfig"]; private ["_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_classID", "_effectivenessFound", "_className", "_hitPoints", "_hitSelections", "_point", "_woundTreatmentConfig"];
_target = _this select 0; params ["_target", "_bandage", "_selectionName", ["_specificClass", -1]];
_bandage = _this select 1;
_selectionName = _this select 2;
_specificClass = if (count _this > 3) then {_this select 3} else { -1 };
// Ensure it is a valid bodypart // Ensure it is a valid bodypart
_part = [_selectionName] call FUNC(selectionNameToNumber); _part = [_selectionName] call FUNC(selectionNameToNumber);
if (_part < 0) exitwith {}; if (_part < 0) exitwith {false};
// Get the open wounds for this unit // Get the open wounds for this unit
_openWounds = _target getvariable [QGVAR(openWounds), []]; _openWounds = _target getvariable [QGVAR(openWounds), []];
if (count _openWounds == 0) exitwith {}; // nothing to do here! if (count _openWounds == 0) exitwith {false}; // nothing to do here!
// Get the default effectiveness for the used bandage // Get the default effectiveness for the used bandage
_config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); _config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging");
@ -43,10 +40,11 @@ _effectivenessFound = -1;
_mostEffectiveInjury = _openWounds select 0; _mostEffectiveInjury = _openWounds select 0;
_exit = false; _exit = false;
{ {
_x params ["", "_classID", "_partX"];
TRACE_2("OPENWOUND: ", _target, _x);
// Only parse injuries that are for the selected bodypart. // Only parse injuries that are for the selected bodypart.
if (_x select 2 == _part) then { if (_partX == _part) then {
_woundEffectivenss = _effectiveness; _woundEffectivenss = _effectiveness;
_classID = (_x select 1);
// Select the classname from the wound classname storage // Select the classname from the wound classname storage
_className = GVAR(woundClassNames) select _classID; _className = GVAR(woundClassNames) select _classID;
@ -59,6 +57,7 @@ _exit = false;
}; };
}; };
TRACE_2("Wound classes: ", _specificClass, _classID);
if (_specificClass == _classID) exitwith { if (_specificClass == _classID) exitwith {
_effectivenessFound = _woundEffectivenss; _effectivenessFound = _woundEffectivenss;
_mostEffectiveSpot = _foreachIndex; _mostEffectiveSpot = _foreachIndex;
@ -74,7 +73,7 @@ _exit = false;
}; };
}; };
if (_exit) exitwith {}; if (_exit) exitwith {};
}foreach _openWounds; } foreach _openWounds;
if (_effectivenessFound == -1) exitwith {}; // Seems everything is patched up on this body part already.. if (_effectivenessFound == -1) exitwith {}; // Seems everything is patched up on this body part already..
@ -96,12 +95,11 @@ if (_impact > 0 && {GVAR(enableAdvancedWounds)}) then {
}; };
// If all wounds have been bandaged, we will reset all damage to 0, so the unit is not showing any blood on the model anymore. // If all wounds have been bandaged, we will reset all damage to 0, so the unit is not showing any blood on the model anymore.
if (GVAR(healHitPointAfterAdvBandage) && {{(_x select 2) == _part && {_x select 3 > 0}}count _openWounds == 0}) then { if (GVAR(healHitPointAfterAdvBandage) && {{(_x select 2) == _part && {((_x select 4) * (_x select 3)) > 0}}count _openWounds == 0}) then {
_hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; _hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"];
_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"];
_point = _hitPoints select (_hitSelections find _selectionName); _point = _hitPoints select (_hitSelections find _selectionName);
[_target, _point, 0] call FUNC(setHitPointDamage); _target setHitPointDamage [_point, 0];
// _target setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true];
}; };
true; true;

View File

@ -10,12 +10,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_caller", "_selectionName", "_className", "_items"]; params ["_caller", "_target", "_selectionName", "_className", "_items"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
_items = _this select 4;
// TODO replace by event system // TODO replace by event system
[[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_fullHealLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_fullHealLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */

View File

@ -10,9 +10,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_caller", "_allUsedMedication"]; private "_allUsedMedication";
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
if (alive _target) exitwith { if (alive _target) exitwith {
@ -64,7 +63,7 @@ if (alive _target) exitwith {
_allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []];
{ {
_target setvariable [_x select 0, nil]; _target setvariable [_x select 0, nil];
}foreach _allUsedMedication; } foreach _allUsedMedication;
// Resetting damage // Resetting damage
_target setDamage 0; _target setDamage 0;

View File

@ -15,12 +15,12 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_totalDamage"]; private "_totalDamage";
_target = _this;
_totalDamage = 0; _totalDamage = 0;
{ {
_totalDamage = _totalDamage + _x; _totalDamage = _totalDamage + _x;
} forEach (_target getVariable [QGVAR(bodyPartStatus), []]); } forEach (_this getVariable [QGVAR(bodyPartStatus), []]);
(10 max (_totalDamage * 10) min 120) (10 max (_totalDamage * 10) min 120)

View File

@ -17,12 +17,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_selectionName", "_className", "_items"]; params ["_caller", "_target", "_selectionName", "_className", "_items"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
_items = _this select 4;
[[_target, _className], QUOTE(DFUNC(treatmentAdvanced_medicationLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [[_target, _className], QUOTE(DFUNC(treatmentAdvanced_medicationLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */
@ -32,7 +27,7 @@ _items = _this select 4;
[_target, "activity", LSTRING(Activity_usedItem), [[_caller] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); [_target, "activity", LSTRING(Activity_usedItem), [[_caller] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog);
[_target, "activity_view", LSTRING(Activity_usedItem), [[_caller] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); [_target, "activity_view", LSTRING(Activity_usedItem), [[_caller] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog);
}; };
}foreach _items; } foreach _items;
true; true;

View File

@ -15,9 +15,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_className", "_currentInSystem", "_medicationConfig", "_painReduce", "_hrIncreaseLow", "_hrIncreaseNorm", "_hrIncreaseHigh", "_maxDose", "_inCompatableMedication", "_timeInSystem", "_heartRate", "_pain", "_resistance", "_hrCallback", "_varName", "_viscosityChange"]; private ["_currentInSystem", "_medicationConfig", "_painReduce", "_hrIncreaseLow", "_hrIncreaseNorm", "_hrIncreaseHigh", "_maxDose", "_inCompatableMedication", "_timeInSystem", "_heartRate", "_pain", "_resistance", "_hrCallback", "_varName", "_viscosityChange"];
_target = _this select 0; params ["_target", "_className"];
_className = _this select 1;
// We have added a new dose of this medication to our system, so let's increase it // We have added a new dose of this medication to our system, so let's increase it
_varName = format[QGVAR(%1_inSystem), _className]; _varName = format[QGVAR(%1_inSystem), _className];

View File

@ -1,23 +1,30 @@
/* /*
* Author: BaerMitUmlaut * Author: BaerMitUmlaut
* Handles treatment via surgical kit per frame. * Handles treatment via surgical kit per frame
*
* Arguments:
* 0: Arguments <ARRAY>
* 0: Caller <OBJECT>
* 1: Target <OBJECT>
* 1: Elapsed Time <NUMBER>
* 2: Total Time <NUMBER>
*
* Return Value:
* Succesful treatment started <BOOL>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_args", "_target", "_caller", "_elapsedTime", "_totalTime", "_bandagedWounds"];
_args = _this select 0; private "_bandagedWounds";
_caller = _args select 0; params ["_args", "_elapsedTime", "_totalTime"];
_target = _args select 1; _args params ["_caller", "_target"];
_elapsedTime = _this select 1;
_totalTime = _this select 2;
_bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []];
//In case two people stitch up one patient and the last wound has already been closed we can stop already //In case two people stitch up one patient and the last wound has already been closed we can stop already
if (count _bandagedWounds == 0) exitWith {false}; if (count _bandagedWounds == 0) exitWith { false };
//Has enough time elapsed that we can close another wound? //Has enough time elapsed that we can close another wound?
if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then { if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then {

View File

@ -9,7 +9,7 @@
* 3: Treatment classname <STRING> * 3: Treatment classname <STRING>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: No * Public: No
*/ */
@ -17,19 +17,7 @@
#include "script_component.hpp" #include "script_component.hpp"
#define BANDAGEHEAL 0.8 #define BANDAGEHEAL 0.8
private ["_caller", "_target","_selection","_className","_target","_hitSelections","_hitPoints","_point", "_damage"]; private ["_hitSelections", "_hitPoints", "_point", "_damage"];
_caller = _this select 0; params ["_caller", "_target", "_selection", "_className"];
_target = _this select 1;
_selection = _this select 2;
_className = _this select 3;
if (_selection == "all") then { [[_target, _selection], QUOTE(DFUNC(treatmentBasic_bandageLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */
_target setDamage ((damage _target - BANDAGEHEAL) max 0);
} else {
_hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"];
_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"];
_point = _hitPoints select (_hitSelections find _selection);
_damage = ((_target getHitPointDamage _point) - BANDAGEHEAL) max 0;
[_target, _point, _damage] call FUNC(setHitPointDamage);
};

View File

@ -0,0 +1,43 @@
/*
* Author: Glowbal
* Handles the bandage of a patient.
*
* Arguments:
* 0: The patient <OBJECT>
* 1: Treatment classname <STRING>
*
*
* Return Value:
* Succesful treatment started <BOOL>
*
* Public: No
*/
#include "script_component.hpp"
#define BANDAGEHEAL 0.8
params ["_target", "_selectionName"];
_damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]];
// Ensure it is a valid bodypart
_part = [_selectionName] call FUNC(selectionNameToNumber);
if (_part < 0) exitwith {false};
if ((_damageBodyParts select _part) > 0) then {
_damageBodyParts set [_part, ((_damageBodyParts select _part) - BANDAGEHEAL) max 0];
_target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true];
TRACE_2("ACE_DEBUG: Treatment BASIC Bandage Broadcast value here",_unit, _target getvariable QGVAR(bodyPartStatus));
};
EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL);
_target setHitPointDamage ["hitHead", _headDamage min 0.95];
_target setHitPointDamage ["hitBody", _torsoDamage min 0.95];
_target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95];
_target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95];
{
_target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95];
}foreach GVAR(HITPOINTS);
true;

Some files were not shown because too many files have changed in this diff Show More