From c7549a13a44b97fa68005f0a069f4c3cf021cfa1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 00:41:53 +0200 Subject: [PATCH 01/26] Improved pain reduction --- addons/medical/ACE_Medical_Treatments.hpp | 2 +- .../functions/fnc_treatmentAdvanced_medicationLocal.sqf | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 9f0484f671..f061f93f48 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -751,7 +751,7 @@ class ACE_Medical_Advanced { // specific details for the ACE_Morphine treatment action class Morphine { - painReduce = 0.7; + painReduce = 1; hrIncreaseLow[] = {-10, -30, 35}; hrIncreaseNormal[] = {-10, -50, 40}; hrIncreaseHigh[] = {-10, -40, 50}; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf index 714f0f7e7f..bbf5aea6c0 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf @@ -71,9 +71,11 @@ if (alive _target) then { }; }; -// Reduce the pain level -_pain = _target getvariable [QGVAR(pain), 0]; -_target setvariable [QGVAR(pain), (_pain - _painReduce) max 0]; +if (_painReduce > 0) then { + // Reduce the pain level + _pain = _target getvariable [QGVAR(pain), 0]; + _target setvariable [QGVAR(pain), (_pain - (_pain * _painReduce)) max 0]; +}; _resistance = _unit getvariable [QGVAR(peripheralResistance), 100]; _resistance = _resistance + _viscosityChange; From 12493f8595566a5d381144d349d2f5379c6cb84b Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 00:57:05 +0200 Subject: [PATCH 02/26] Improved wounds configuration (missing maxDamage values added) --- addons/medical/ACE_Medical_Treatments.hpp | 30 +++++++++++++++---- addons/medical/XEH_postInit.sqf | 4 +-- .../functions/fnc_handleDamage_wounds.sqf | 12 +++++--- .../functions/fnc_parseConfigForInjuries.sqf | 3 +- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index f061f93f48..097292d9cc 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -295,14 +295,16 @@ class ACE_Medical_Advanced { selections[] = {"All"}; bleedingRate = 0.0001; pain = 0.01; - causes[] = {"falling", "ropeburn", "vehiclecrash"}; + causes[] = {"falling", "ropeburn", "vehiclecrash", "unknown"}; minDamage = 0.01; class Minor { minDamage = 0.01; + maxDamage = 0.2; bleedingRate = 0.0001; }; class Medium { minDamage = 0.2; + maxDamage = 0.3; bleedingRate = 0.00015; }; class Large { @@ -321,10 +323,12 @@ class ACE_Medical_Advanced { minDamage = 0.2; class Minor { minDamage = 0.2; + maxDamage = 0.3; bleedingRate = 0.01; }; class Medium { minDamage = 0.3; + maxDamage = 0.6; bleedingRate = 0.02; }; class Large { @@ -341,14 +345,18 @@ class ACE_Medical_Advanced { pain = 0.05; causes[] = {"bullet", "backblast", "punch","vehiclecrash","falling"}; minDamage = 0.01; + maxDamage = 0.1; class Minor { minDamage = 0.01; + maxDamage = 0.1; }; class Medium { minDamage = 0.1; + maxDamage = 0.15; }; class Large { - minDamage = 0.3; + minDamage = 0.15; + maxDamage = 0.2; }; }; @@ -358,14 +366,16 @@ class ACE_Medical_Advanced { selections[] = {"All"}; bleedingRate = 0.01; pain = 0.1; - causes[] = {"falling", "vehiclecrash", "punch"}; + causes[] = {"falling", "vehiclecrash", "punch", "unknown"}; minDamage = 0.1; class Minor { minDamage = 0.1; + maxDamage = 0.45; bleedingRate = 0.005; }; class Medium { minDamage = 0.4; + maxDamage = 0.7; bleedingRate = 0.007; }; class Large { @@ -380,14 +390,16 @@ class ACE_Medical_Advanced { selections[] = {"All"}; bleedingRate = 0.01; pain = 0.075; - causes[] = {"vehiclecrash", "grenade", "explosive", "shell", "backblast", "stab"}; + causes[] = {"vehiclecrash", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; minDamage = 0.1; class Minor { minDamage = 0.1; + maxDamage = 0.3; bleedingRate = 0.005; }; class Medium { minDamage = 0.3; + maxDamage = 0.65; bleedingRate = 0.02; }; class Large { @@ -406,10 +418,12 @@ class ACE_Medical_Advanced { minDamage = 0.01; class Minor { minDamage = 0.1; + maxDamage = 0.5; bleedingRate = 0.005; }; class Medium { minDamage = 0.5; + maxDamage = 0.7; bleedingRate = 0.01; }; class Large { @@ -424,10 +438,11 @@ class ACE_Medical_Advanced { selections[] = {"All"}; bleedingRate = 0.01; pain = 0.2; - causes[] = {"bullet", "grenade","explosive", "shell"}; + causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; minDamage = 0.15; class Minor { minDamage = 0.15; + maxDamage = 0.3; bleedingRate = 0.025; }; class Medium { @@ -450,10 +465,12 @@ class ACE_Medical_Advanced { minDamage = 0.01; class Minor { minDamage = 0.01; + maxDamage = 0.5; bleedingRate = 0.01; }; class Medium { minDamage = 0.5; + maxDamage = 0.75; bleedingRate = 0.03; }; class Large { @@ -518,6 +535,9 @@ class ACE_Medical_Advanced { thresholds[] = {{0.1, 1}}; selectionSpecific = 1; }; + class unknown { + thresholds[] = {{0.1, 1}}; + }; }; }; class Treatment { diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 27f2ce07b9..ea9ac70550 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -134,9 +134,9 @@ GVAR(effectTimeBlood) = time; _bleeding = ACE_player call FUNC(getBloodLoss); // Bleeding Indicator - if (_bleeding > 0 and GVAR(effectTimeBlood) + 6 < time) then { + if (_bleeding > 0 and GVAR(effectTimeBlood) + 3.5 < time) then { GVAR(effectTimeBlood) = time; - [500 * _bleeding] call BIS_fnc_bloodEffect; + [600 * _bleeding] call BIS_fnc_bloodEffect; }; // Blood Volume Effect diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index b2d7b3514d..1eebe038cd 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -33,6 +33,13 @@ _injuryTypeInfo = missionNamespace getvariable [format[QGVAR(woundInjuryType_%1) // This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] _allInjuriesForDamageType = _injuryTypeInfo select 2; +// It appears we are dealing with an unknown type of damage. + +if (count _allInjuriesForDamageType == 0) then { + // grabbing the configuration for unknown damage type + _injuryTypeInfo = missionNamespace getvariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; + _allInjuriesForDamageType = _injuryTypeInfo select 2; +}; // find the available injuries for this damage type and damage amount _highestPossibleSpot = -1; @@ -67,10 +74,7 @@ _allPossibleInjuries = []; // No possible wounds available for this damage type or damage amount. if (_highestPossibleSpot < 0) exitwith { - // It appears we are dealing with an unknown type of damage. - if (count _allInjuriesForDamageType == 0) then { - }; }; // Administration for open wounds and ids @@ -84,7 +88,7 @@ _woundsCreated = []; for "_i" from 0 to (1+ floor(random(_x select 1)-1)) /* step +1 */ do { // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] - _toAddInjury = if (random(1) >= 0.5) then {_allInjuriesForDamageType select _highestPossibleSpot} else {_allPossibleInjuries select (floor(random (count _allPossibleInjuries)));}; + _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {_allPossibleInjuries select (floor(random (count _allPossibleInjuries)));}; _toAddClassID = _toAddInjury select 0; _foundIndex = -1; diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf index 4efc7ac8ae..c624b1af1b 100644 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical/functions/fnc_parseConfigForInjuries.sqf @@ -12,10 +12,9 @@ #include "script_component.hpp" -private ["_injuriesRootConfig", "_woundsConfig", "_allWoundClasses", "_amountOf", "_entry","_classType", "_selections", "_bloodLoss", "_pain","_minDamage","_causes", "_allTypes", "_damageTypesConfig", "_thresholds", "_typeThresholds", "_selectionSpecific", "_selectionSpecificType", "_classDisplayName", "_subClassDisplayName", "_maxDamage", "_subClassmaxDamage", "_defaultMinLethalDamage", "_minLethalDamage"]; +private ["_injuriesRootConfig", "_woundsConfig", "_allWoundClasses", "_amountOf", "_entry","_classType", "_selections", "_bloodLoss", "_pain","_minDamage","_causes", "_damageTypesConfig", "_thresholds", "_typeThresholds", "_selectionSpecific", "_selectionSpecificType", "_classDisplayName", "_subClassDisplayName", "_maxDamage", "_subClassmaxDamage", "_defaultMinLethalDamage", "_minLethalDamage"]; _injuriesRootConfig = (configFile >> "ACE_Medical_Advanced" >> "Injuries"); -_allTypes = ["stab", "grenade", "bullet", "explosive", "shell", "punch", "vehiclecrash", "backblast", "falling", "bite", "ropeburn"]; _allFoundDamageTypes = []; _configDamageTypes = (_injuriesRootConfig >> "damageTypes"); From 7fb3ac67403c7cf20b4727390e83b62bc02f93d5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 19:16:56 +0200 Subject: [PATCH 03/26] Added _x_ca suffixes to all item pictures --- addons/medical/CfgWeapons.hpp | 28 +++++++++--------- .../items/{atropine.paa => atropine_x_ca.paa} | Bin .../items/{bloodIV.paa => bloodIV_x_ca.paa} | Bin .../items/{bodybag.paa => bodybag_x_ca.paa} | Bin ...ticBandage.paa => elasticBandage_x_ca.paa} | Bin .../{epinephrine.paa => epinephrine_x_ca.paa} | Bin ...eldDressing.paa => fieldDressing_x_ca.paa} | Bin .../items/{morphine.paa => morphine_x_ca.paa} | Bin ...ingBandage.paa => packingBandage_x_ca.paa} | Bin ..._aid_kit.paa => personal_aid_kit_x_ca.paa} | Bin .../items/{plasmaIV.paa => plasmaIV_x_ca.paa} | Bin .../{quickclot.paa => quickclot_x_ca.paa} | Bin .../items/{salineIV.paa => salineIV_x_ca.paa} | Bin .../{surgicalKit.paa => surgicalKit_x_ca.paa} | Bin .../{tourniquet.paa => tourniquet_x_ca.paa} | Bin 15 files changed, 14 insertions(+), 14 deletions(-) rename addons/medical/ui/items/{atropine.paa => atropine_x_ca.paa} (100%) rename addons/medical/ui/items/{bloodIV.paa => bloodIV_x_ca.paa} (100%) rename addons/medical/ui/items/{bodybag.paa => bodybag_x_ca.paa} (100%) rename addons/medical/ui/items/{elasticBandage.paa => elasticBandage_x_ca.paa} (100%) rename addons/medical/ui/items/{epinephrine.paa => epinephrine_x_ca.paa} (100%) rename addons/medical/ui/items/{fieldDressing.paa => fieldDressing_x_ca.paa} (100%) rename addons/medical/ui/items/{morphine.paa => morphine_x_ca.paa} (100%) rename addons/medical/ui/items/{packingBandage.paa => packingBandage_x_ca.paa} (100%) rename addons/medical/ui/items/{personal_aid_kit.paa => personal_aid_kit_x_ca.paa} (100%) rename addons/medical/ui/items/{plasmaIV.paa => plasmaIV_x_ca.paa} (100%) rename addons/medical/ui/items/{quickclot.paa => quickclot_x_ca.paa} (100%) rename addons/medical/ui/items/{salineIV.paa => salineIV_x_ca.paa} (100%) rename addons/medical/ui/items/{surgicalKit.paa => surgicalKit_x_ca.paa} (100%) rename addons/medical/ui/items/{tourniquet.paa => tourniquet_x_ca.paa} (100%) diff --git a/addons/medical/CfgWeapons.hpp b/addons/medical/CfgWeapons.hpp index 6545464ea9..51795d266c 100644 --- a/addons/medical/CfgWeapons.hpp +++ b/addons/medical/CfgWeapons.hpp @@ -24,7 +24,7 @@ class CfgWeapons { class ACE_fieldDressing: ACE_ItemCore { scope = 2; model = QUOTE(PATHTOF(data\bandage.p3d)); - picture = QUOTE(PATHTOF(ui\items\fieldDressing.paa)); + picture = QUOTE(PATHTOF(ui\items\fieldDressing_x_ca.paa)); displayName = $STR_ACE_MEDICAL_BANDAGE_BASIC_DISPLAY; descriptionShort = $STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_USE; @@ -38,7 +38,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_PACKING_BANDAGE_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\packingBandage.paa)); + picture = QUOTE(PATHTOF(ui\items\packingBandage_x_ca.paa)); model = QUOTE(PATHTOF(data\packingbandage.p3d)); descriptionShort = $STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_USE; @@ -52,7 +52,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_BANDAGE_ELASTIC_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\elasticBandage.paa)); + picture = QUOTE(PATHTOF(ui\items\elasticBandage_x_ca.paa)); model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d"; descriptionShort = $STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_USE; @@ -66,7 +66,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_TOURNIQUET_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\tourniquet.paa)); + picture = QUOTE(PATHTOF(ui\items\tourniquet_x_ca.paa)); model = QUOTE(PATHTOF(data\tourniquet.p3d)); descriptionShort = $STR_ACE_MEDICAL_TOURNIQUET_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_TOURNIQUET_DESC_USE; @@ -80,7 +80,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_MORPHINE_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\morphine.paa)); + picture = QUOTE(PATHTOF(ui\items\morphine_x_ca.paa)); model = QUOTE(PATHTOF(data\morphine.p3d)); descriptionShort = $STR_ACE_MEDICAL_MORPHINE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_MORPHINE_DESC_USE; @@ -94,7 +94,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_ATROPINE_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\atropine.paa)); + picture = QUOTE(PATHTOF(ui\items\atropine_x_ca.paa)); model = QUOTE(PATHTOF(data\atropine.p3d)); descriptionShort = $STR_ACE_MEDICAL_ATROPINE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_ATROPINE_DESC_USE; @@ -109,7 +109,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_EPINEPHRINE_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\epinephrine.paa)); + picture = QUOTE(PATHTOF(ui\items\epinephrine_x_ca.paa)); model = QUOTE(PATHTOF(data\epinephrine.p3d)); descriptionShort = $STR_ACE_MEDICAL_EPINEPHRINE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_EPINEPHRINE_DESC_USE; @@ -122,7 +122,7 @@ class CfgWeapons { value = 1; count = 1; displayName = $STR_ACE_MEDICAL_PLASMA_IV; - picture = QUOTE(PATHTOF(ui\items\plasmaIV.paa)); + picture = QUOTE(PATHTOF(ui\items\plasmaIV_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_PLASMA_IV_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_PLASMA_IV_DESC_USE; class ItemInfo: InventoryItem_Base_F { @@ -147,7 +147,7 @@ class CfgWeapons { count = 1; model = "\A3\Structures_F_EPA\Items\Medical\BloodBag_F.p3d"; displayName = $STR_ACE_MEDICAL_BLOOD_IV; - picture = QUOTE(PATHTOF(ui\items\bloodIV.paa)); + picture = QUOTE(PATHTOF(ui\items\bloodIV_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_BLOOD_IV_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_BLOOD_IV_DESC_USE; class ItemInfo: InventoryItem_Base_F { @@ -171,7 +171,7 @@ class CfgWeapons { value = 1; count = 1; displayName = $STR_ACE_MEDICAL_SALINE_IV; - picture = QUOTE(PATHTOF(ui\items\salineIV.paa)); + picture = QUOTE(PATHTOF(ui\items\salineIV_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_SALINE_IV_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_SALINE_IV_DESC_USE; class ItemInfo: InventoryItem_Base_F { @@ -196,7 +196,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_QUIKCLOT_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\quickclot.paa)); + picture = QUOTE(PATHTOF(ui\items\quickclot_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_QUIKCLOT_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_QUIKCLOT_DESC_USE; class ItemInfo: InventoryItem_Base_F { @@ -209,7 +209,7 @@ class CfgWeapons { count = 1; type = 16; displayName = $STR_ACE_MEDICAL_AID_KIT_DISPLAY; - picture = QUOTE(PATHTOF(ui\items\personal_aid_kit.paa)); + picture = QUOTE(PATHTOF(ui\items\personal_aid_kit_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_AID_KIT_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_AID_KIT_DESC_USE; class ItemInfo: InventoryItem_Base_F { @@ -220,7 +220,7 @@ class CfgWeapons { scope=2; displayName= $STR_ACE_MEDICAL_SURGICALKIT_DISPLAY; model = QUOTE(PATHTOF(data\surgical_kit.p3d)); - picture = QUOTE(PATHTOF(ui\items\surgicalKit.paa)); + picture = QUOTE(PATHTOF(ui\items\surgicalKit_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_SURGICALKIT_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_SURGICALKIT_DESC_USE; class ItemInfo: InventoryItem_Base_F { @@ -231,7 +231,7 @@ class CfgWeapons { scope=2; displayName= $STR_ACE_MEDICAL_BODYBAG_DISPLAY; model = QUOTE(PATHTOF(data\bodybagItem.p3d)); - picture = QUOTE(PATHTOF(ui\items\bodybag.paa)); + picture = QUOTE(PATHTOF(ui\items\bodybag_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_BODYBAG_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_BODYBAG_DESC_USE; class ItemInfo: InventoryItem_Base_F { diff --git a/addons/medical/ui/items/atropine.paa b/addons/medical/ui/items/atropine_x_ca.paa similarity index 100% rename from addons/medical/ui/items/atropine.paa rename to addons/medical/ui/items/atropine_x_ca.paa diff --git a/addons/medical/ui/items/bloodIV.paa b/addons/medical/ui/items/bloodIV_x_ca.paa similarity index 100% rename from addons/medical/ui/items/bloodIV.paa rename to addons/medical/ui/items/bloodIV_x_ca.paa diff --git a/addons/medical/ui/items/bodybag.paa b/addons/medical/ui/items/bodybag_x_ca.paa similarity index 100% rename from addons/medical/ui/items/bodybag.paa rename to addons/medical/ui/items/bodybag_x_ca.paa diff --git a/addons/medical/ui/items/elasticBandage.paa b/addons/medical/ui/items/elasticBandage_x_ca.paa similarity index 100% rename from addons/medical/ui/items/elasticBandage.paa rename to addons/medical/ui/items/elasticBandage_x_ca.paa diff --git a/addons/medical/ui/items/epinephrine.paa b/addons/medical/ui/items/epinephrine_x_ca.paa similarity index 100% rename from addons/medical/ui/items/epinephrine.paa rename to addons/medical/ui/items/epinephrine_x_ca.paa diff --git a/addons/medical/ui/items/fieldDressing.paa b/addons/medical/ui/items/fieldDressing_x_ca.paa similarity index 100% rename from addons/medical/ui/items/fieldDressing.paa rename to addons/medical/ui/items/fieldDressing_x_ca.paa diff --git a/addons/medical/ui/items/morphine.paa b/addons/medical/ui/items/morphine_x_ca.paa similarity index 100% rename from addons/medical/ui/items/morphine.paa rename to addons/medical/ui/items/morphine_x_ca.paa diff --git a/addons/medical/ui/items/packingBandage.paa b/addons/medical/ui/items/packingBandage_x_ca.paa similarity index 100% rename from addons/medical/ui/items/packingBandage.paa rename to addons/medical/ui/items/packingBandage_x_ca.paa diff --git a/addons/medical/ui/items/personal_aid_kit.paa b/addons/medical/ui/items/personal_aid_kit_x_ca.paa similarity index 100% rename from addons/medical/ui/items/personal_aid_kit.paa rename to addons/medical/ui/items/personal_aid_kit_x_ca.paa diff --git a/addons/medical/ui/items/plasmaIV.paa b/addons/medical/ui/items/plasmaIV_x_ca.paa similarity index 100% rename from addons/medical/ui/items/plasmaIV.paa rename to addons/medical/ui/items/plasmaIV_x_ca.paa diff --git a/addons/medical/ui/items/quickclot.paa b/addons/medical/ui/items/quickclot_x_ca.paa similarity index 100% rename from addons/medical/ui/items/quickclot.paa rename to addons/medical/ui/items/quickclot_x_ca.paa diff --git a/addons/medical/ui/items/salineIV.paa b/addons/medical/ui/items/salineIV_x_ca.paa similarity index 100% rename from addons/medical/ui/items/salineIV.paa rename to addons/medical/ui/items/salineIV_x_ca.paa diff --git a/addons/medical/ui/items/surgicalKit.paa b/addons/medical/ui/items/surgicalKit_x_ca.paa similarity index 100% rename from addons/medical/ui/items/surgicalKit.paa rename to addons/medical/ui/items/surgicalKit_x_ca.paa diff --git a/addons/medical/ui/items/tourniquet.paa b/addons/medical/ui/items/tourniquet_x_ca.paa similarity index 100% rename from addons/medical/ui/items/tourniquet.paa rename to addons/medical/ui/items/tourniquet_x_ca.paa From 3d82cb8eac6398db9a1d2b308ff768b148cb53bb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 19:54:24 +0200 Subject: [PATCH 04/26] Removed deprecated onTreatmentCompleted event --- addons/medical/XEH_postInit.sqf | 1 - addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf | 1 - addons/medical/functions/fnc_treatmentAdvanced_medication.sqf | 1 - addons/medical/functions/fnc_treatmentIV.sqf | 1 - addons/medical/functions/fnc_treatmentTourniquet.sqf | 2 +- 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index ea9ac70550..7d52ff36d4 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -8,7 +8,6 @@ GVAR(heartBeatSounds_Fast) = ["ACE_heartbeat_fast_1", "ACE_heartbeat_fast_2", "A GVAR(heartBeatSounds_Normal) = ["ACE_heartbeat_norm_1", "ACE_heartbeat_norm_2"]; GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]; -["Medical_treatmentCompleted", FUNC(onTreatmentCompleted)] call ace_common_fnc_addEventHandler; ["medical_propagateWound", FUNC(onPropagateWound)] call ace_common_fnc_addEventHandler; ["medical_woundUpdateRequest", FUNC(onWoundUpdateRequest)] call ace_common_fnc_addEventHandler; ["interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call ace_common_fnc_addEventHandler; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf index 6584569227..91ae7f61c1 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf @@ -37,7 +37,6 @@ if !([_target] call FUNC(hasMedicalEnabled)) exitwith { }; }foreach _items;*/ -["Medical_treatmentCompleted", [_caller, _target, _selectionName, _className, true]] call ace_common_fnc_localEvent; [_target, "activity", "STR_ACE_MEDICAL_ACTIVITY_bandagedPatient", [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf index 4d83a97c2e..508040b8af 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf @@ -32,7 +32,6 @@ _items = _this select 4; }; }foreach _items; -["Medical_treatmentCompleted", [_caller, _target, _selectionName, _className, true]] call ace_common_fnc_localEvent; [_target, "activity", "STR_ACE_MEDICAL_ACTIVITY_usedItem", [[_caller] call EFUNC(common,getName), _className]] call FUNC(addToLog); true; diff --git a/addons/medical/functions/fnc_treatmentIV.sqf b/addons/medical/functions/fnc_treatmentIV.sqf index 532b1a733c..c171d7364f 100644 --- a/addons/medical/functions/fnc_treatmentIV.sqf +++ b/addons/medical/functions/fnc_treatmentIV.sqf @@ -28,6 +28,5 @@ if (count _items == 0) exitwith {}; _removeItem = _items select 0; [[_target, _removeItem], QUOTE(DFUNC(treatmentIVLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ -["Medical_treatmentCompleted", [_caller, _target, _selectionName, _className, true]] call ace_common_fnc_localEvent; [_target, _removeItem] call FUNC(addToTriageCard); [_target, "activity", "STR_ACE_MEDICAL_ACTIVITY_gaveIV", [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical/functions/fnc_treatmentTourniquet.sqf b/addons/medical/functions/fnc_treatmentTourniquet.sqf index 379ddbda7a..cff9458426 100644 --- a/addons/medical/functions/fnc_treatmentTourniquet.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquet.sqf @@ -41,7 +41,7 @@ if ((_tourniquets select _part) > 0) exitwith { _removeItem = _items select 0; [[_target, _removeItem], QUOTE(DFUNC(treatmentTourniquetLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ -["Medical_treatmentCompleted", [_caller, _target, _selectionName, _className, true]] call ace_common_fnc_localEvent; + [_target, _removeItem] call FUNC(addToTriageCard); [_target, "activity", "STR_ACE_MEDICAL_ACTIVITY_appliedTourniquet", [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); From 526e24f1335dc7ce23a0e2f13a595a7fdc5ad3b1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 19:56:54 +0200 Subject: [PATCH 05/26] formatting --- .../medical/functions/fnc_actionDropUnit.sqf | 4 +- .../functions/fnc_actionRemoveTourniquet.sqf | 3 - addons/medical/functions/fnc_copyDeadBody.sqf | 4 +- .../functions/fnc_dropDownTriageCard.sqf | 10 +- .../functions/fnc_handleBandageOpening.sqf | 108 +++++++++--------- addons/medical/functions/fnc_handleKilled.sqf | 10 +- .../functions/fnc_onCarryObjectDropped.sqf | 2 +- .../functions/fnc_onWoundUpdateRequest.sqf | 8 +- .../fnc_treatmentAdvanced_bandage.sqf | 2 +- .../functions/fnc_treatmentBasic_epipen.sqf | 2 +- .../functions/fnc_treatmentIVLocal.sqf | 4 +- .../functions/fnc_treatment_failure.sqf | 4 +- .../functions/fnc_treatment_success.sqf | 2 +- 13 files changed, 80 insertions(+), 83 deletions(-) diff --git a/addons/medical/functions/fnc_actionDropUnit.sqf b/addons/medical/functions/fnc_actionDropUnit.sqf index db1c02aced..53883c93c1 100644 --- a/addons/medical/functions/fnc_actionDropUnit.sqf +++ b/addons/medical/functions/fnc_actionDropUnit.sqf @@ -17,7 +17,7 @@ private "_caller"; _caller = _this select 0; if (!isnil QGVAR(DROP_ADDACTION)) then { - [_caller,objNull] call EFUNC(common,carryObj); - _caller removeAction GVAR(DROP_ADDACTION); + [_caller,objNull] call EFUNC(common,carryObj); + _caller removeAction GVAR(DROP_ADDACTION); GVAR(DROP_ADDACTION) = nil; }; diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf index 75d7b67daa..2eafe36732 100644 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf @@ -26,7 +26,6 @@ _tourniquets = _target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; // Check if there is a tourniquet on this bodypart if ((_tourniquets select _part) == 0) exitwith { - // TODO localization _output = "There is no tourniquet on this body part!"; ["displayTextStructured", [_caller], [_output, 1.5, _caller]] call EFUNC(common,targetEvent); }; @@ -37,5 +36,3 @@ _target setvariable [QGVAR(tourniquets), _tourniquets, true]; // Adding the tourniquet item to the caller _caller addItem "ACE_tourniquet"; - -// "AinvPknlMstpSlayWrflDnon_medic diff --git a/addons/medical/functions/fnc_copyDeadBody.sqf b/addons/medical/functions/fnc_copyDeadBody.sqf index 68d5a356ec..8e476b8662 100644 --- a/addons/medical/functions/fnc_copyDeadBody.sqf +++ b/addons/medical/functions/fnc_copyDeadBody.sqf @@ -67,9 +67,9 @@ _newUnit selectWeapon (primaryWeapon _newUnit); // We are attaching the old unit and hiding it, so we can keep the original unit until later. _oldBody attachTo [_newUnit, [0,0,0]]; if (isMultiplayer) then { - hideObjectGlobal _oldBody; + hideObjectGlobal _oldBody; } else { - hideObject _oldBody; + hideObject _oldBody; }; _newUnit setvariable [QGVAR(copyOfUnit), _oldBody, true]; diff --git a/addons/medical/functions/fnc_dropDownTriageCard.sqf b/addons/medical/functions/fnc_dropDownTriageCard.sqf index 5e763822db..6ea910b7af 100644 --- a/addons/medical/functions/fnc_dropDownTriageCard.sqf +++ b/addons/medical/functions/fnc_dropDownTriageCard.sqf @@ -22,11 +22,11 @@ if (isnil "_display") exitwith {}; _pos = [0,0,0,0]; if (_show) then { - _pos = ctrlPosition (_display displayCtrl 2001); + _pos = ctrlPosition (_display displayCtrl 2001); }; for "_idc" from 2002 to 2006 step 1 do { - _pos set [1, (_pos select 1) + (_pos select 3)]; - _ctrl = (_display displayCtrl _idc); - _ctrl ctrlSetPosition _pos; - _ctrl ctrlCommit 0; + _pos set [1, (_pos select 1) + (_pos select 3)]; + _ctrl = (_display displayCtrl _idc); + _ctrl ctrlSetPosition _pos; + _ctrl ctrlCommit 0; }; diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf index eb35b3e8c5..b4e40984ae 100644 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -38,81 +38,81 @@ _reopeningMaxDelay = 200; _config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); if (isClass (_config >> _bandage)) then { _config = (_config >> _bandage); - _reopeningChance = getNumber (_config >> "reopeningChance"); - _reopeningMinDelay = getNumber (_config >> "reopeningMinDelay"); - _reopeningMaxDelay = getNumber (_config >> "reopeningMaxDelay") max _reopeningMinDelay; + _reopeningChance = getNumber (_config >> "reopeningChance"); + _reopeningMinDelay = getNumber (_config >> "reopeningMinDelay"); + _reopeningMaxDelay = getNumber (_config >> "reopeningMaxDelay") max _reopeningMinDelay; }; if (isClass (_config >> _className)) then { _woundTreatmentConfig = (_config >> _className); if (isNumber (_woundTreatmentConfig >> "reopeningChance")) then { - _reopeningChance = getNumber (_woundTreatmentConfig >> "reopeningChance"); - }; + _reopeningChance = getNumber (_woundTreatmentConfig >> "reopeningChance"); + }; if (isNumber (_woundTreatmentConfig >> "reopeningMinDelay")) then { - _reopeningMinDelay = getNumber (_woundTreatmentConfig >> "reopeningMinDelay"); - }; + _reopeningMinDelay = getNumber (_woundTreatmentConfig >> "reopeningMinDelay"); + }; if (isNumber (_woundTreatmentConfig >> "reopeningMaxDelay")) then { - _reopeningMaxDelay = getNumber (_woundTreatmentConfig >> "reopeningMaxDelay") max _reopeningMinDelay; - }; + _reopeningMaxDelay = getNumber (_woundTreatmentConfig >> "reopeningMaxDelay") max _reopeningMinDelay; + }; }; _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _exist = false; _injuryId = _injury select 0; { - if ((_x select 0) == _injuryId) exitwith { - _exist = true; - _existingInjury = _x; - _existingInjury set [3, (_existingInjury select 3) + _impact]; - _bandagedWounds set [_foreachIndex, _existingInjury]; - }; + if ((_x select 0) == _injuryId) exitwith { + _exist = true; + _existingInjury = _x; + _existingInjury set [3, (_existingInjury select 3) + _impact]; + _bandagedWounds set [_foreachIndex, _existingInjury]; + }; }foreach _bandagedWounds; if !(_exist) then { - // [ID, classID, bodypart, percentage treated, bloodloss rate] - _bandagedWounds pushback [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4]; + // [ID, classID, bodypart, percentage treated, bloodloss rate] + _bandagedWounds pushback [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4]; }; _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; // Check if we are ever going to reopen this if (random(1) <= _reopeningChance) then { - _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); - [{ - private ["_target", "_impact", "_part", "_injuryIndex", "_bandage", "_injury", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"]; - _target = _this select 0; - _impact = _this select 1; - _part = _this select 2; - _injuryIndex = _this select 3; - _injury = _this select 4; + _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); + [{ + private ["_target", "_impact", "_part", "_injuryIndex", "_bandage", "_injury", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"]; + _target = _this select 0; + _impact = _this select 1; + _part = _this select 2; + _injuryIndex = _this select 3; + _injury = _this select 4; - if (alive _target) then { - _openWounds = _target getvariable [QGVAR(openWounds), []]; - if ((count _openWounds)-1 < _injuryIndex) exitwith {}; - _selectedInjury = _openWounds select _injuryIndex; - if (_selectedInjury select 0 == _injury select 0) then { // matching the IDs - _selectedInjury set [3, (_selectedInjury select 3) + _impact]; - _openWounds set [_injuryIndex, _selectedInjury]; - _target setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; - if (USE_WOUND_EVENT_SYNC) then { - ["medical_propagateWound", [_target, _selectedInjury]] call EFUNC(common,globalEvent); - }; - _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; - _exist = false; - _injuryId = _injury select 0; - { - if ((_x select 0) == _injuryId) exitwith { - _exist = true; - _existingInjury = _x; - _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; - _bandagedWounds set [_foreachIndex, _existingInjury]; - }; - }foreach _bandagedWounds; + if (alive _target) then { + _openWounds = _target getvariable [QGVAR(openWounds), []]; + if ((count _openWounds)-1 < _injuryIndex) exitwith {}; + _selectedInjury = _openWounds select _injuryIndex; + if (_selectedInjury select 0 == _injury select 0) then { // matching the IDs + _selectedInjury set [3, (_selectedInjury select 3) + _impact]; + _openWounds set [_injuryIndex, _selectedInjury]; + _target setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; + if (USE_WOUND_EVENT_SYNC) then { + ["medical_propagateWound", [_target, _selectedInjury]] call EFUNC(common,globalEvent); + }; + _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; + _exist = false; + _injuryId = _injury select 0; + { + if ((_x select 0) == _injuryId) exitwith { + _exist = true; + _existingInjury = _x; + _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; + _bandagedWounds set [_foreachIndex, _existingInjury]; + }; + }foreach _bandagedWounds; - if (_exist) then { - _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; - }; - }; - // Otherwise something went wrong, we we don't reopen them.. - }; - }, [_target, _impact, _part, _injuryIndex, _injury], _delay, 0] call EFUNC(common,waitAndExecute); + if (_exist) then { + _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; + }; + }; + // Otherwise something went wrong, we we don't reopen them.. + }; + }, [_target, _impact, _part, _injuryIndex, _injury], _delay, 0] call EFUNC(common,waitAndExecute); }; diff --git a/addons/medical/functions/fnc_handleKilled.sqf b/addons/medical/functions/fnc_handleKilled.sqf index 1a602bd702..ce0f087836 100644 --- a/addons/medical/functions/fnc_handleKilled.sqf +++ b/addons/medical/functions/fnc_handleKilled.sqf @@ -24,9 +24,9 @@ if (GVAR(level) >= 2) then { _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; - }; + _openWounds = _unit getvariable [QGVAR(openWounds), []]; + { + ["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent); + }foreach _openWounds; + }; }; diff --git a/addons/medical/functions/fnc_onCarryObjectDropped.sqf b/addons/medical/functions/fnc_onCarryObjectDropped.sqf index 8f6dd57310..6a6a990d53 100644 --- a/addons/medical/functions/fnc_onCarryObjectDropped.sqf +++ b/addons/medical/functions/fnc_onCarryObjectDropped.sqf @@ -33,7 +33,7 @@ if (_carrying >= 0) then { _target setvariable [QGVAR(hasCopy), nil, true]; }; - _caller setvariable [QGVAR(isCarrying), -1, true]; + _caller setvariable [QGVAR(isCarrying), -1, true]; if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; }; diff --git a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf index a32288d0a6..c160e47ea0 100644 --- a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf +++ b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf @@ -20,8 +20,8 @@ _lastId = _this select 1; _originOfrequest = _this select 2; if (local _unit) then { - _openWounds = _unit getvariable [QGVAR(openWounds), []]; - { - ["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent); - }foreach _openWounds; + _openWounds = _unit getvariable [QGVAR(openWounds), []]; + { + ["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent); + }foreach _openWounds; }; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf index 91ae7f61c1..146e996d25 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf @@ -27,7 +27,7 @@ _items = _this select 4; _specificSpot = if (count _this > 6) then {_this select 6} else {-1}; if !([_target] call FUNC(hasMedicalEnabled)) exitwith { - _this call FUNC(treatmentBasic_bandage); + _this call FUNC(treatmentBasic_bandage); }; [[_target, _className, _selectionName, _specificSpot], QUOTE(DFUNC(treatmentAdvanced_bandageLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf b/addons/medical/functions/fnc_treatmentBasic_epipen.sqf index ead2bf9d52..bdfb95fb2a 100644 --- a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_epipen.sqf @@ -24,5 +24,5 @@ _className = _this select 3; [_target, false] call FUNC(setUnconscious); if (_target getvariable [QGVAR(inReviveState), false]) then { - _target setvariable [QGVAR(inReviveState), nil, true]; + _target setvariable [QGVAR(inReviveState), nil, true]; }; diff --git a/addons/medical/functions/fnc_treatmentIVLocal.sqf b/addons/medical/functions/fnc_treatmentIVLocal.sqf index b0b5ce6a7f..66ecdf9d90 100644 --- a/addons/medical/functions/fnc_treatmentIVLocal.sqf +++ b/addons/medical/functions/fnc_treatmentIVLocal.sqf @@ -37,6 +37,6 @@ _varName = format["ACE_Medical_IVVolume_%1",_typeOf]; _target setvariable [_varName, (_target getvariable [_varName, 0]) + _volumeAdded, true]; if !(_varName in GVAR(IVBags)) then { - GVAR(IVBags) pushback _varName; - publicVariable QGVAR(IVBags); + GVAR(IVBags) pushback _varName; + publicVariable QGVAR(IVBags); }; diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index 1a22e191fd..d4f853374c 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -30,12 +30,12 @@ if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; }; if (vehicle _caller == _caller) then { - [_caller, _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""], 1] call EFUNC(common,doAnimation); + [_caller, _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""], 1] call EFUNC(common,doAnimation); }; _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; { - (_x select 0) addItem (_x select 1); + (_x select 0) addItem (_x select 1); }foreach _usersOfItems; // Record specific callback diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index 85cfbf7e52..5910a4be86 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -28,7 +28,7 @@ if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; }; if (vehicle _caller == _caller) then { - [_caller, _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""], 1] call EFUNC(common,doAnimation); + [_caller, _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""], 1] call EFUNC(common,doAnimation); }; _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; From ac3bda31355d0aa37c92e45bb148fd45af681fd2 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 20:19:32 +0200 Subject: [PATCH 06/26] improvements to displayPatientInformation. Bandaged wounds should be more clear now --- .../fnc_displayPatientInformation.sqf | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index 599c2f344f..2e0525f1a3 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -14,11 +14,12 @@ #include "script_component.hpp" -private ["_target", "_show"]; +private ["_target", "_show", "_selectionN"]; _target = _this select 0; _show = if (count _this > 1) then {_this select 1} else {true}; -GVAR(currentSelectedSelectionN) = if (count _this > 2) then {_this select 2} else {0}; +_selectionN = if (count _this > 2) then {_this select 2} else {0}; +GVAR(currentSelectedSelectionN) = if (typeName _selectionN == "SCALAR") then {_selectionN} else {0}; GVAR(displayPatientInformationTarget) = if (_show) then {_target} else {ObjNull}; if (USE_WOUND_EVENT_SYNC) then { @@ -75,6 +76,7 @@ if (_show) then { _genericMessages pushback [format[localize "STR_ACE_MEDICAL_receivingIvVolume", floor _totalIvVolume], [1, 1, 1, 1]]; }; + _damaged = [false, false, false, false, false, false]; _selectionBloodLoss = [0,0,0,0,0,0]; if (GVAR(level) >= 2) then { _openWounds = _target getvariable [QGVAR(openWounds), []]; @@ -82,10 +84,12 @@ if (_show) then { { _amountOf = _x select 3; // Find how much this bodypart is bleeding - _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (15 * ((_x select 4) * _amountOf))]; - if (GVAR(currentSelectedSelectionN) == (_x select 2)) then { + if (_amountOf > 0) then { + _damaged set[_x select 2, true]; + _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; + + if (_selectionN == (_x select 2)) 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] - if (_amountOf > 0) then { if (_amountOf >= 1) then { // TODO localization _allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf], [1,1,1,1]]; @@ -101,27 +105,28 @@ if (_show) then { { _amountOf = _x select 3; // Find how much this bodypart is bleeding - //if (_selectionBloodLoss select (_x select 2) == 0) then { - // _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (15 * ((_x select 4) * _amountOf))]; - //}; - if (GVAR(currentSelectedSelectionN) == (_x select 2)) then { + if !(_damaged select (_x select 2)) then { + _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; + }; + if (_selectionN == (_x select 2)) 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] if (_amountOf > 0) then { if (_amountOf >= 1) then { // TODO localization - _allInjuryTexts pushback [format["[B] %2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf], [1,0.5,0.5,1]]; + _allInjuryTexts pushback [format["[B] %2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf], [0.88,0.7,0.65,1]]; } else { // TODO localization - _allInjuryTexts pushback [format["[B] Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [1,0.5,0.5,1]]; + _allInjuryTexts pushback [format["[B] Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [0.88,0.7,0.65,1]]; }; }; }; }foreach _bandagedwounds; } else { + _damaged = [true, true, true, true, true, true]; { _selectionBloodLoss set [_forEachIndex, _target getHitPointDamage _x]; - if (_target getHitPointDamage _x > 0.1) then { + if (_target getHitPointDamage _x > 0.1 && {_forEachIndex == _selectionN}) then { // @todo localize _allInjuryTexts pushBack [format ["%1 %2", ["Lightly wounded", "Heavily wounded"] select (_target getHitPointDamage _x > 0.5), @@ -132,7 +137,7 @@ if (_show) then { }; // Handle the body image coloring - _damaged = [false, false, false, false, false, false]; + _availableSelections = [50,51,52,53,54,55]; { private ["_red", "_green", "_blue"]; @@ -141,27 +146,30 @@ if (_show) then { _red = 1; _green = 1; _blue = 1; - if (_total >0) then { - _green = 0.9 - _total; - if (_green < 0.0) then { - _green = 0.0; + if (_total > 0) then { + if (_damaged select _forEachIndex) then { + _green = (0.9 - _total) max 0; + _blue = _green; + } else { + _green = (0.9 - _total) max 0; + _red = _green; + //_blue = _green; }; - _blue = _green; - _damaged set[_foreachIndex, true]; }; (_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; }foreach _selectionBloodLoss; - // TODO fill the lb with the appropiate information for the patient _lbCtrl = (_display displayCtrl 200); lbClear _lbCtrl; { _lbCtrl lbAdd (_x select 0); _lbCtrl lbSetColor [_foreachIndex, _x select 1]; }foreach _genericMessages; + + _amountOfGeneric = count _genericMessages; { _lbCtrl lbAdd (_x select 0); - _lbCtrl lbSetColor [_foreachIndex, _x select 1]; + _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _x select 1]; }foreach _allInjuryTexts; if (count _allInjuryTexts == 0) then { _lbCtrl lbAdd "No injuries on this bodypart.."; From 545014b07391c2cbcfb7ed1b0fd57664158c1cd6 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 20:47:36 +0200 Subject: [PATCH 07/26] missing return value --- addons/medical/functions/fnc_determineIfFatal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_determineIfFatal.sqf b/addons/medical/functions/fnc_determineIfFatal.sqf index 978aa16b2b..6c90e54da3 100644 --- a/addons/medical/functions/fnc_determineIfFatal.sqf +++ b/addons/medical/functions/fnc_determineIfFatal.sqf @@ -16,7 +16,7 @@ _part = _this select 1; _withDamage = if (count _this > 2) then { _this select 2} else {0}; if (!alive _unit) exitwith {true}; -if (_part < 0 || _part > 5) exitwith {}; +if (_part < 0 || _part > 5) exitwith {false}; if ((vehicle _unit != _unit) && {!alive (vehicle _unit)}) exitwith { true }; // Find the correct Damage threshold for unit. From 2b341c2a8b5b55f4d1bf877dabaa78145c40ff61 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 20:50:44 +0200 Subject: [PATCH 08/26] left over CSE function calls removed --- addons/medical/functions/fnc_actionLoadUnit.sqf | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index 7f55d585d6..b4320d8d73 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -23,9 +23,6 @@ if ([_target] call EFUNC(common,isAwake)) exitwith { ["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); }; -[_caller, objNull] call cse_fnc_carryObj; -[_target, objNull] call cse_fnc_carryObj; - _vehicle = [_caller, _target] call EFUNC(common,loadPerson); if (!isNull _vehicle) then { if (!isnil QGVAR(DROP_ADDACTION)) then { From c72dd39691637ae3fc57f68fff5651726afeae29 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 13:53:40 -0500 Subject: [PATCH 09/26] Build script: use cmd line cfgConvert --- .../pabstFrankensteinBuilder.py | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/tools/ace_build_tool/pabstFrankensteinBuilder.py b/tools/ace_build_tool/pabstFrankensteinBuilder.py index a0c57f2b3e..09b12a5dc3 100644 --- a/tools/ace_build_tool/pabstFrankensteinBuilder.py +++ b/tools/ace_build_tool/pabstFrankensteinBuilder.py @@ -576,33 +576,25 @@ See the make.cfg file for additional build options. if build_tool == "pboproject": try: #PABST: Convert config (run the macro'd config.cpp through CfgConvert twice to produce a de-macro'd cpp that pboProject can read without fucking up: - os.chdir(os.path.join(arma3tools_path, "CfgConvert")) shutil.copyfile(os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.backup")) - ret = subprocess.call(["cfgConvertGUI.exe", os.path.join(work_drive, prefix, module, "config.cpp")]) - if ret != 0: - print_error("cfgConvertGUI (bin) return code == " + str(ret)) - input("Press Enter to continue...") - - #PABST: Need micro sleeps because cfgConvertGUI can return before it's finished procressing - time.sleep(0.05) - - ret = subprocess.call(["cfgConvertGUI.exe", os.path.join(work_drive, prefix, module, "config.bin")]) - if ret != 0: - print_error("cfgConvertGUI (txt) return code == " + str(ret)) - input("Press Enter to continue...") - - time.sleep(0.05) - - #cmd = [rapifyTool, "-L", "-P", os.path.join(work_drive, prefix, module, "config.cpp")]; - #ret = subprocess.call(cmd) - #if ret != 0: - # print_error("rapifyTool return code == " + str(ret) + str(cmd)) - # input("Press Enter to continue...") - - # Call pboProject os.chdir("P:\\") + cmd = [os.path.join(work_drive, "CfgConvert", "CfgConvert.exe"), "-bin", "-dst", os.path.join(work_drive, prefix, module, "config.bin"), os.path.join(work_drive, prefix, module, "config.cpp")] + ret = subprocess.call(cmd) + #ret = subprocess.call(["cfgConvertGUI.exe", os.path.join(work_drive, prefix, module, "config.cpp")]) + + if ret != 0: + print_error("CfgConvert -bin return code == " + str(ret)) + input("Press Enter to continue...") + + + cmd = [os.path.join(work_drive, "CfgConvert", "CfgConvert.exe"), "-txt", "-dst", os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.bin")] + ret = subprocess.call(cmd) + if ret != 0: + print_error("CfgConvert -txt) return code == " + str(ret)) + input("Press Enter to continue...") + if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): print_green("$NOBIN$ Found. Proceeding with non-binarizing!") cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")] From 722c2af4dc2b37056cf6054764837ac2ab15d40f Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 7 Apr 2015 20:54:25 +0200 Subject: [PATCH 10/26] lightIntensity, handle soldier flashlights --- addons/common/XEH_preInit.sqf | 1 + .../fnc_getLightPropertiesWeapon.sqf | 58 ++++++++++++++ .../fnc_lightIntensityFromObject.sqf | 75 +++++++++++++++---- 3 files changed, 118 insertions(+), 16 deletions(-) create mode 100644 addons/common/functions/fnc_getLightPropertiesWeapon.sqf diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 95a639b943..b7da27ea75 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -193,6 +193,7 @@ PREP(getHitPoints); PREP(getHitPointsWithSelections); PREP(getReflectorsWithSelections); PREP(getLightProperties); +PREP(getLightPropertiesWeapon); PREP(getVehicleCrew); // turrets diff --git a/addons/common/functions/fnc_getLightPropertiesWeapon.sqf b/addons/common/functions/fnc_getLightPropertiesWeapon.sqf new file mode 100644 index 0000000000..d444654b5f --- /dev/null +++ b/addons/common/functions/fnc_getLightPropertiesWeapon.sqf @@ -0,0 +1,58 @@ +/* + * Author: commy2 + * Read properties of given flashlight. @todo, Can weapons themselves still have flashlights (no attachment)? + * + * Arguments: + * 0: A flashlight (String) + * + * Return Value: + * Stuff from config (Array) + * + */ +#include "script_component.hpp" + +private "_weapon"; + +_weapon = _this select 0; + +private "_config"; +_config = configFile >> "CfgWeapons" >> _weapon >> "ItemInfo" >> "FlashLight"; + +private ["_intensity", "_position", "_direction", "_innerAngle", "_outerAngle"]; + +_intensity = getNumber (_config >> "intensity"); +_position = getText (_config >> "position"); +_direction = getText (_config >> "direction"); +_innerAngle = getNumber (_config >> "innerAngle"); +_outerAngle = getNumber (_config >> "outerAngle"); + +[_intensity, _position, _direction, _innerAngle, _outerAngle] + +/* +class FlashLight +{ + color[] = {180,156,120}; + ambient[] = {0.9,0.78,0.6}; + intensity = 20; + size = 1; + innerAngle = 20; + outerAngle = 80; + coneFadeCoef = 5; + position = "flash dir"; + direction = "flash"; + useFlare = 1; + flareSize = 1.4; + flareMaxDistance = "100.0f"; + dayLight = 0; + class Attenuation + { + start = 0.5; + constant = 0; + linear = 0; + quadratic = 1.1; + hardLimitStart = 20; + hardLimitEnd = 30; + }; + scale[] = {0}; +}; +*/ diff --git a/addons/common/functions/fnc_lightIntensityFromObject.sqf b/addons/common/functions/fnc_lightIntensityFromObject.sqf index cf9e215403..1a79ceb211 100644 --- a/addons/common/functions/fnc_lightIntensityFromObject.sqf +++ b/addons/common/functions/fnc_lightIntensityFromObject.sqf @@ -20,37 +20,80 @@ _lightSource = _this select 1; private "_unitPos"; _unitPos = _unit modelToWorld (_unit selectionPosition "spine3"); -private ["_lights", "_lightLevel"]; - -_lights = [_lightSource] call FUNC(getTurnedOnLights); - +private "_lightLevel"; _lightLevel = 0; -{ - private ["_properties", "_intensity", "_innerAngle", "_outerAngle", "_position", "_direction", "_directionToUnit", "_distance", "_angle"]; +if (_lightSource isKindOf "CAManBase") then { + // handle persons with flashlights - _properties = [_lightSource, _x] call FUNC(getLightProperties); + private "_weapon"; + _weapon = currentWeapon _lightSource; - // @todo intensity affects range? - //_intensity = _properties select 0; + if !(_lightSource isFlashlightOn _weapon) exitWith {}; + + private ["_flashlight", "_properties", "_intensity", "_innerAngle", "_outerAngle", "_position", "_direction", "_directionToUnit", "_distance", "_angle"]; + + _flashlight = switch (_weapon) do { + case (primaryWeapon _lightSource): { + primaryWeaponItems _lightSource select 1 + }; + case (secondaryWeapon _lightSource): { + secondaryWeaponItems _lightSource select 1 + }; + case (handgunWeapon _lightSource): { + handgunItems _lightSource select 1 + }; + default {""}; + }; + + _properties = [_flashlight] call FUNC(getLightPropertiesWeapon); _innerAngle = (_properties select 3) / 2; _outerAngle = (_properties select 4) / 2; - // get world position and direction - _position = _lightSource modelToWorld (_lightSource selectionPosition (_properties select 1)); - _direction = _lightSource modelToWorld (_lightSource selectionPosition (_properties select 2)); + _position = _lightSource modelToWorld (_lightSource selectionPosition "rightHand"); + _direction = _lightSource weaponDirection _weapon; - _direction = _position vectorFromTo _direction; _directionToUnit = _position vectorFromTo _unitPos; _distance = _unitPos distance _position; _angle = acos (_direction vectorDotProduct _directionToUnit); - _lightLevel = _lightLevel max ((linearConversion [0, 30, _distance, 1, 0, true]) * (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true])); + _lightLevel = (linearConversion [0, 30, _distance, 1, 0, true]) * (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true]); -//systemChat format ["%1 %2", (linearConversion [0, 30, _distance, 1, 0, true]), (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true])]; +} else { + // handle any object, strcutures, cars, tanks, etc. -} forEach _lights; + private "_lights"; + _lights = [_lightSource] call FUNC(getTurnedOnLights); + + { + private ["_properties", "_intensity", "_innerAngle", "_outerAngle", "_position", "_direction", "_directionToUnit", "_distance", "_angle"]; + + _properties = [_lightSource, _x] call FUNC(getLightProperties); + + // @todo intensity affects range? + //_intensity = _properties select 0; + + _innerAngle = (_properties select 3) / 2; + _outerAngle = (_properties select 4) / 2; + + // get world position and direction + _position = _lightSource modelToWorld (_lightSource selectionPosition (_properties select 1)); + _direction = _lightSource modelToWorld (_lightSource selectionPosition (_properties select 2)); + + _direction = _position vectorFromTo _direction; + _directionToUnit = _position vectorFromTo _unitPos; + + _distance = _unitPos distance _position; + _angle = acos (_direction vectorDotProduct _directionToUnit); + + _lightLevel = _lightLevel max ((linearConversion [0, 30, _distance, 1, 0, true]) * (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true])); + + //systemChat format ["%1 %2", (linearConversion [0, 30, _distance, 1, 0, true]), (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true])]; + + } forEach _lights; + +}; _lightLevel From ffbe9f0c71e82248d6aab7f9b0b52222a1ec3b57 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 7 Apr 2015 21:06:48 +0200 Subject: [PATCH 11/26] Setting for getting rid of hitpoint damage after adv medical damage --- addons/medical/ACE_Settings.hpp | 4 ++++ .../functions/fnc_treatmentAdvanced_bandageLocal.sqf | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 0af12c0a37..4d2f2db9be 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -113,4 +113,8 @@ class ACE_Settings { typeName = "BOOL"; value = 1; }; + class GVAR(healHitPointAfterAdvBandage) { + typeName = "BOOL"; + value = 1; + }; }; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index 0eaa8b4fa8..217a69cd4d 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -96,8 +96,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 (count _openWounds == 0) then { - _target setDamage 0; +if (GVAR(healHitPointAfterAdvBandage) && {{(_x select 2) == _part && {_x select 3 > 0}}count _openWounds == 0}) then { + _hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; + _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; + _point = _hitPoints select (_hitSelections find _selectionName); + [_target, _point, 0] call FUNC(setHitPointDamage); // _target setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; }; From d825505aa07318da5625260d49495a30c18c61c4 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 7 Apr 2015 21:22:00 +0200 Subject: [PATCH 12/26] cache light config properties --- addons/common/functions/fnc_lightIntensityFromObject.sqf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/common/functions/fnc_lightIntensityFromObject.sqf b/addons/common/functions/fnc_lightIntensityFromObject.sqf index 1a79ceb211..f9749ab8a0 100644 --- a/addons/common/functions/fnc_lightIntensityFromObject.sqf +++ b/addons/common/functions/fnc_lightIntensityFromObject.sqf @@ -46,7 +46,8 @@ if (_lightSource isKindOf "CAManBase") then { default {""}; }; - _properties = [_flashlight] call FUNC(getLightPropertiesWeapon); + _properties = [[_flashlight], FUNC(getLightPropertiesWeapon), uiNamespace, format [QEGVAR(cache,%1_%2), QUOTE(DFUNC(getLightPropertiesWeapon)), _flashlight], 1E11] call FUNC(cachedCall); + //_properties = [_flashlight] call FUNC(getLightPropertiesWeapon); _innerAngle = (_properties select 3) / 2; _outerAngle = (_properties select 4) / 2; @@ -70,7 +71,8 @@ if (_lightSource isKindOf "CAManBase") then { { private ["_properties", "_intensity", "_innerAngle", "_outerAngle", "_position", "_direction", "_directionToUnit", "_distance", "_angle"]; - _properties = [_lightSource, _x] call FUNC(getLightProperties); + _properties = [[_lightSource, _x], FUNC(getLightProperties), uiNamespace, format [QEGVAR(cache,%1_%2_%3), QUOTE(DFUNC(getLightProperties)), typeOf _lightSource, _x], 1E11] call FUNC(cachedCall); + //_properties = [_lightSource, _x] call FUNC(getLightProperties); // @todo intensity affects range? //_intensity = _properties select 0; From 2ad9193475bbb85475f46748934c661b28a68d4a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 14:38:35 -0500 Subject: [PATCH 13/26] Use DrawIcon for map tools --- addons/maptools/XEH_postInitClient.sqf | 2 +- .../functions/fnc_handleMouseButton.sqf | 112 +++++++++--------- .../functions/fnc_handleMouseMove.sqf | 2 +- .../functions/fnc_isInsideMapTool.sqf | 2 + .../functions/fnc_mapStateUpdater.sqf | 7 -- .../functions/fnc_updateMapToolMarkers.sqf | 60 +++------- 6 files changed, 76 insertions(+), 109 deletions(-) diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index e94cdaf266..26fb005e9f 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -28,7 +28,7 @@ GVAR(drawing_controls) = [36732, 36733, 36734, 36735, 36736, 36737]; ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseMoving", {_this call FUNC(handleMouseMove);}]; ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseButtonDown", {[1, _this] call FUNC(handleMouseButton);}]; ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseButtonUp", {[0, _this] call FUNC(handleMouseButton)}]; - ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapToolMarkers);}]; + ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["Draw", {_this call FUNC(updateMapToolMarkers);}]; (finddisplay _d) displayAddEventHandler ["KeyDown", {_this call FUNC(handleKeyDown);}]; }; diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index b0eb848e61..8db6b8b0f1 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -31,72 +31,72 @@ if (_button != 0) exitWith {}; // If releasing if (_dir != 1 && (GVAR(mapTool_isDragging) or GVAR(mapTool_isRotating))) exitWith { - GVAR(mapTool_isDragging) = false; - GVAR(mapTool_isRotating) = false; - _handled = true; - _handled + GVAR(mapTool_isDragging) = false; + GVAR(mapTool_isRotating) = false; + _handled = true; + _handled }; // If clicking if (_dir == 1) exitWith { - if !(call FUNC(canDraw)) exitWith {_handled = false;}; + if !(call FUNC(canDraw)) exitWith {_handled = false;}; - // Transform mouse screen position to coordinates - _pos = _control ctrlMapScreenToWorld _screenPos; - _pos set [count _pos, 0]; + // Transform mouse screen position to coordinates + _pos = _control ctrlMapScreenToWorld _screenPos; + _pos set [count _pos, 0]; - if (GVAR(drawing_isDrawing)) exitWith { - // Already drawing -> Add tempLineMarker to permanent list - if (GVAR(drawing_syncMarkers)) then { - deleteMarkerLocal (GVAR(drawing_tempLineMarker) select 0); - // [GVAR(drawing_tempLineMarker), "FUNC(addLineMarker)", 2] call EFUNC(common,execRemoteFnc); - ["drawing_addLineMarker", GVAR(drawing_tempLineMarker)] call EFUNC(common,globalEvent); - // Log who drew on the briefing screen - (text format ["[ACE] Server: Player %1 drew on the briefing screen", name player]) call EFUNC(common,serverLog); - } else { - GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); - GVAR(drawing_lineMarkers) pushBack (+GVAR(drawing_tempLineMarker)); + if (GVAR(drawing_isDrawing)) exitWith { + // Already drawing -> Add tempLineMarker to permanent list + if (GVAR(drawing_syncMarkers)) then { + deleteMarkerLocal (GVAR(drawing_tempLineMarker) select 0); + // [GVAR(drawing_tempLineMarker), "FUNC(addLineMarker)", 2] call EFUNC(common,execRemoteFnc); + ["drawing_addLineMarker", GVAR(drawing_tempLineMarker)] call EFUNC(common,globalEvent); + // Log who drew on the briefing screen + (text format ["[ACE] Server: Player %1 drew on the briefing screen", name player]) call EFUNC(common,serverLog); + } else { + GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); + GVAR(drawing_lineMarkers) pushBack (+GVAR(drawing_tempLineMarker)); + }; + GVAR(drawing_tempLineMarker) = []; + GVAR(drawing_isDrawing) = false; + _handled = true; }; - GVAR(drawing_tempLineMarker) = []; - GVAR(drawing_isDrawing) = false; - _handled = true; - }; - if (_altKey) exitWith { - // Start drawing - GVAR(drawing_isDrawing) = true; - // Create tempLineMarker - _gui = format ["%1%2%3%4", random (100), random (100), random (100), random (100)]; - GVAR(drawing_tempLineMarker) = [_gui, + _pos, + _pos, GVAR(drawing_drawColor)]; - _marker = createMarkerLocal [_gui, [0,0]]; - GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); - _handled = true; - }; - - GVAR(mapTool_isDragging) = false; - GVAR(mapTool_isRotating) = false; - - // If no map tool marker then exit - if (isNil QGVAR(mapTool_markerRotatingFixed)) exitWith {_handled = false;}; - - // Check if clicking the maptool - if (_pos call FUNC(isInsideMapTool)) exitWith { - // Store data for dragging - GVAR(mapTool_startPos) = + GVAR(mapTool_pos); - GVAR(mapTool_startDragPos) = + _pos; - if (_ctrlKey) then { - // Store data for rotating - GVAR(mapTool_startAngle) = + GVAR(mapTool_angle); - GVAR(mapTool_startDragAngle) = (180 + ((GVAR(mapTool_startDragPos) select 0) - (GVAR(mapTool_startPos) select 0)) atan2 ((GVAR(mapTool_startDragPos) select 1) - (GVAR(mapTool_startPos) select 1)) mod 360); - // Start rotating - GVAR(mapTool_isRotating) = true; - } else { - // Start dragging - GVAR(mapTool_isDragging) = true; + if (_altKey) exitWith { + // Start drawing + GVAR(drawing_isDrawing) = true; + // Create tempLineMarker + _gui = format ["%1%2%3%4", random (100), random (100), random (100), random (100)]; + GVAR(drawing_tempLineMarker) = [_gui, + _pos, + _pos, GVAR(drawing_drawColor)]; + _marker = createMarkerLocal [_gui, [0,0]]; + GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); + _handled = true; + }; + + GVAR(mapTool_isDragging) = false; + GVAR(mapTool_isRotating) = false; + + // If no map tool marker then exit + if (GVAR(mapTool_Shown) == 0) exitWith {_handled = false;}; + + // Check if clicking the maptool + if (_pos call FUNC(isInsideMapTool)) exitWith { + // Store data for dragging + GVAR(mapTool_startPos) = + GVAR(mapTool_pos); + GVAR(mapTool_startDragPos) = + _pos; + if (_ctrlKey) then { + // Store data for rotating + GVAR(mapTool_startAngle) = + GVAR(mapTool_angle); + GVAR(mapTool_startDragAngle) = (180 + ((GVAR(mapTool_startDragPos) select 0) - (GVAR(mapTool_startPos) select 0)) atan2 ((GVAR(mapTool_startDragPos) select 1) - (GVAR(mapTool_startPos) select 1)) mod 360); + // Start rotating + GVAR(mapTool_isRotating) = true; + } else { + // Start dragging + GVAR(mapTool_isDragging) = true; + }; + _handled = true; }; - _handled = true; - }; }; _handled diff --git a/addons/maptools/functions/fnc_handleMouseMove.sqf b/addons/maptools/functions/fnc_handleMouseMove.sqf index 6df07cfead..99c36f1581 100644 --- a/addons/maptools/functions/fnc_handleMouseMove.sqf +++ b/addons/maptools/functions/fnc_handleMouseMove.sqf @@ -37,7 +37,7 @@ if (GVAR(drawing_isDrawing)) exitWith { }; // Handle Map tools -if (isNil QGVAR(mapTool_markerRotatingFixed)) exitWith {false}; +if (GVAR(mapTool_Shown) == 0) exitWith {false}; // Translation if (GVAR(mapTool_isDragging)) exitWith { diff --git a/addons/maptools/functions/fnc_isInsideMapTool.sqf b/addons/maptools/functions/fnc_isInsideMapTool.sqf index 4e2339f9f1..b4d4fc8814 100644 --- a/addons/maptools/functions/fnc_isInsideMapTool.sqf +++ b/addons/maptools/functions/fnc_isInsideMapTool.sqf @@ -18,6 +18,8 @@ #define DIST_TOP_TO_CENTER_PERC 0.65 #define DIST_LEFT_TO_CENTER_PERC 0.30 + + if (GVAR(mapTool_Shown) == 0) exitWith {false}; _textureWidth = [TEXTURE_WIDTH_IN_M, TEXTURE_WIDTH_IN_M / 2] select (GVAR(mapTool_Shown) - 1); diff --git a/addons/maptools/functions/fnc_mapStateUpdater.sqf b/addons/maptools/functions/fnc_mapStateUpdater.sqf index efc5efb956..ffe331df71 100644 --- a/addons/maptools/functions/fnc_mapStateUpdater.sqf +++ b/addons/maptools/functions/fnc_mapStateUpdater.sqf @@ -18,13 +18,6 @@ if (GVAR(mapVisableLastFrame) && (!visibleMap)) then { GVAR(mapVisableLastFrame) = false; // Hide GPS [false] call FUNC(openMapGps); - // Hide Map tools - deleteMarkerLocal MARKERNAME_MAPTOOL_FIXED; - deleteMarkerLocal MARKERNAME_MAPTOOL_ROTATINGNORMAL; - deleteMarkerLocal MARKERNAME_MAPTOOL_ROTATINGSMALL; - GVAR(mapTool_markerRotatingFixed) = nil; - GVAR(mapTool_markerRotatingNormal) = nil; - GVAR(mapTool_markerRotatingSmall) = nil; // Cancel drawing call FUNC(cancelDrawing); }; diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index bb096bd064..13967413f6 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -1,10 +1,9 @@ /* * Author: esteldunedain - * * Update the map tool markers, position, size, rotation and visibility. * - * Argument: - * None + * Arguments: + * 0: The Map * * Return value: * Nothing @@ -16,58 +15,31 @@ #define CENTER_OFFSET_Y_PERC 0.1606 #define CONSTANT_SCALE 0.2 -// If markers exist and they should'nt, delete them -if (!("ACE_MapTools" in items ACE_player) || {GVAR(mapTool_Shown) == 0}) then { - // If markers exist, delete them - if (!isNil QGVAR(mapTool_markerRotatingFixed)) then { - deleteMarkerLocal MARKERNAME_MAPTOOL_FIXED; - GVAR(mapTool_markerRotatingFixed) = nil; - }; -}; -if (!("ACE_MapTools" in items ACE_player) || {GVAR(mapTool_Shown) != 1}) then { - if (!isNil QGVAR(mapTool_markerRotatingNormal)) then { - deleteMarkerLocal MARKERNAME_MAPTOOL_ROTATINGNORMAL; - GVAR(mapTool_markerRotatingNormal) = nil; - }; -}; -if (!("ACE_MapTools" in items ACE_player) || {GVAR(mapTool_Shown) != 2}) then { - if (!isNil QGVAR(mapTool_markerRotatingSmall)) then { - deleteMarkerLocal MARKERNAME_MAPTOOL_ROTATINGSMALL; - GVAR(mapTool_markerRotatingSmall) = nil; - }; -}; +PARAMS_1(_theMap); if (!("ACE_MapTools" in items ACE_player)|| {GVAR(mapTool_Shown) == 0}) exitWith {}; -// If markers don't exist and should, create them -if (isNil QGVAR(mapTool_markerRotatingFixed)) then { - GVAR(mapTool_markerRotatingFixed) = createMarkerLocal [MARKERNAME_MAPTOOL_FIXED, GVAR(mapTool_pos)]; - MARKERNAME_MAPTOOL_FIXED setMarkerType MARKERNAME_MAPTOOL_FIXED; +_rotatingTexture = ""; +_textureWidth = 0; +if (GVAR(mapTool_Shown) == 1) then { + _rotatingTexture = QUOTE(PATHTOF(data\mapToolRotatingNormal.paa)); + _textureWidth = TEXTURE_WIDTH_IN_M; +} else { + _rotatingTexture = QUOTE(PATHTOF(data\mapToolRotatingSmall.paa)); + _textureWidth = TEXTURE_WIDTH_IN_M / 2; }; -if ((isNil QGVAR(mapTool_markerRotatingNormal)) && {GVAR(mapTool_Shown) == 1}) then { - GVAR(mapTool_markerRotatingNormal) = createMarkerLocal [MARKERNAME_MAPTOOL_ROTATINGNORMAL, GVAR(mapTool_pos)]; - MARKERNAME_MAPTOOL_ROTATINGNORMAL setMarkerType MARKERNAME_MAPTOOL_ROTATINGNORMAL; -}; -if ((isNil QGVAR(mapTool_markerRotatingSmall)) && {GVAR(mapTool_Shown) == 2}) then { - GVAR(mapTool_markerRotatingSmall) = createMarkerLocal [MARKERNAME_MAPTOOL_ROTATINGSMALL, GVAR(mapTool_pos)]; - MARKERNAME_MAPTOOL_ROTATINGSMALL setMarkerType MARKERNAME_MAPTOOL_ROTATINGSMALL; -}; - -_rotatingMarker = [MARKERNAME_MAPTOOL_ROTATINGNORMAL, MARKERNAME_MAPTOOL_ROTATINGSMALL] select (GVAR(mapTool_Shown) - 1); -_textureWidth = [TEXTURE_WIDTH_IN_M, TEXTURE_WIDTH_IN_M / 2] select (GVAR(mapTool_Shown) - 1); // Update scale of both parts -_scale = _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale)); -MARKERNAME_MAPTOOL_FIXED setMarkerSizeLocal [_scale,_scale]; -_rotatingMarker setMarkerSizeLocal [_scale,_scale]; +_scale = _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale)); // Position of the fixed part _xPos = GVAR(mapTool_pos) select 0; _yPos = (GVAR(mapTool_pos) select 1) + _textureWidth * CENTER_OFFSET_Y_PERC; -MARKERNAME_MAPTOOL_FIXED setMarkerPosLocal [_xPos,_yPos]; + +_theMap drawIcon [QUOTE(PATHTOF(data\mapToolFixed.paa)), [1,1,1,1], [_xPos,_yPos], (32 * _scale), (32 * _scale), 0, "", 0]; // Position and rotation of the rotating part _xPos = (GVAR(mapTool_pos) select 0) + sin(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC; _yPos = (GVAR(mapTool_pos) select 1) + cos(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC; -_rotatingMarker setMarkerPosLocal [_xPos,_yPos]; -_rotatingMarker setMarkerDirLocal GVAR(mapTool_angle); + +_theMap drawIcon [_rotatingTexture, [1,1,1,1], [_xPos,_yPos], (32 * _scale), (32 * _scale), GVAR(mapTool_angle), "", 0]; From 88a5519465c90be3d7d79d0eb1be9293c06ac01c Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 7 Apr 2015 21:42:08 +0200 Subject: [PATCH 14/26] cache the frames --- addons/common/functions/fnc_getTurnedOnLights.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_getTurnedOnLights.sqf b/addons/common/functions/fnc_getTurnedOnLights.sqf index 6f0dc5a9bb..e50c15f593 100644 --- a/addons/common/functions/fnc_getTurnedOnLights.sqf +++ b/addons/common/functions/fnc_getTurnedOnLights.sqf @@ -19,7 +19,8 @@ if (!isLightOn _vehicle) exitWith {[]}; private ["_reflectorsWithSelections", "_lights", "_hitpoints"]; -_reflectorsWithSelections = [_vehicle] call FUNC(getReflectorsWithSelections); +_reflectorsWithSelections = [[_vehicle], FUNC(getReflectorsWithSelections), uiNamespace, format [QEGVAR(cache,%1_%2), QUOTE(DFUNC(getReflectorsWithSelections)), typeOf _vehicle], 1E11] call FUNC(cachedCall); +//_reflectorsWithSelections = [_vehicle] call FUNC(getReflectorsWithSelections); _lights = _reflectorsWithSelections select 0; _hitpoints = _reflectorsWithSelections select 1; From 6b0fb84f65d291c81f25bf4fd8f763de6bc19a8e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 15:01:44 -0500 Subject: [PATCH 15/26] Cleanup / Headers --- addons/maptools/CfgMarkers.hpp | 26 ------- addons/maptools/config.cpp | 1 - .../maptools/functions/fnc_addLineMarker.sqf | 28 +++---- .../functions/fnc_calculateMapScale.sqf | 8 +- addons/maptools/functions/fnc_canDraw.sqf | 14 +++- .../maptools/functions/fnc_canUseMapGPS.sqf | 14 +++- .../maptools/functions/fnc_canUseMapTools.sqf | 14 +++- .../maptools/functions/fnc_cancelDrawing.sqf | 10 +-- .../functions/fnc_copyMapReceiveMarkers.sqf | 20 ++--- .../maptools/functions/fnc_copyMapStart.sqf | 7 +- .../maptools/functions/fnc_handleKeyDown.sqf | 73 +++++++++---------- .../functions/fnc_handleMouseMove.sqf | 38 +++++----- .../functions/fnc_handleMouseZChanged.sqf | 16 ++-- .../functions/fnc_isInsideMapTool.sqf | 9 +-- .../functions/fnc_mapStateUpdater.sqf | 38 +++++----- addons/maptools/functions/fnc_openMapGps.sqf | 29 ++++---- .../functions/fnc_openMapGpsUpdate.sqf | 6 +- .../functions/fnc_removeLineMarker.sqf | 27 ++++--- .../functions/fnc_updateLineMarker.sqf | 30 ++++---- .../functions/fnc_updateMapToolMarkers.sqf | 3 +- addons/maptools/script_component.hpp | 5 -- 21 files changed, 203 insertions(+), 213 deletions(-) delete mode 100644 addons/maptools/CfgMarkers.hpp diff --git a/addons/maptools/CfgMarkers.hpp b/addons/maptools/CfgMarkers.hpp deleted file mode 100644 index 8a2b86fc13..0000000000 --- a/addons/maptools/CfgMarkers.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// MARKERS -class CfgMarkers { - class ACE_MapToolFixed { - name = "MapToolFixed"; - icon = PATHTOF(data\mapToolFixed.paa); - scope = 0; - color[] = {1,1,1,1}; - size = 32; - }; - - class ACE_MapToolRotatingNormal { - name = "MapToolRotating"; - icon = PATHTOF(data\mapToolRotatingNormal.paa); - scope = 0; - color[] = {1,1,1,1}; - size = 32; - }; - - class ACE_MapToolRotatingSmall { - name = "MapToolRotating"; - icon = PATHTOF(data\mapToolRotatingSmall.paa); - scope = 0; - color[] = {1,1,1,1}; - size = 32; - }; -}; diff --git a/addons/maptools/config.cpp b/addons/maptools/config.cpp index d5b1f26396..6ccf874e69 100644 --- a/addons/maptools/config.cpp +++ b/addons/maptools/config.cpp @@ -32,7 +32,6 @@ class RscEdit; #include "MapGpsUI.hpp" #include "CfgEventHandlers.hpp" -#include "CfgMarkers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/maptools/functions/fnc_addLineMarker.sqf b/addons/maptools/functions/fnc_addLineMarker.sqf index a55792e98a..83e983d0e3 100644 --- a/addons/maptools/functions/fnc_addLineMarker.sqf +++ b/addons/maptools/functions/fnc_addLineMarker.sqf @@ -1,18 +1,18 @@ /* * Author: esteldunedain - * * Add the line marker * - * Argument: - * 0: Marker Name (string) - * 1: Marker start pos (array) - * 2: Marker end pos (array) - * 3: Color index (Number) + * Arguments: + * 0: Marker Name + * 1: Marker start pos + * 2: Marker end pos + * 3: Color index * * Return value: - * Return + * None + * + * Public: No */ - #include "script_component.hpp" _name = _this select 0; @@ -27,16 +27,16 @@ _name setMarkerColorLocal _color; _name setMarkerPosLocal (_startPos vectorAdd (_difPos vectorMultiply 0.5)); _mag = vectorMagnitude _difPos; if (_mag > 0) then { - _name setMarkerSizeLocal [5, _mag / 2]; - _name setMarkerDirLocal (180 + (_difPos select 0) atan2 (_difPos select 1) mod 360); + _name setMarkerSizeLocal [5, _mag / 2]; + _name setMarkerDirLocal (180 + (_difPos select 0) atan2 (_difPos select 1) mod 360); } else { - _name setMarkerSizeLocal [5, 5]; - _name setMarkerDirLocal 0; + _name setMarkerSizeLocal [5, 5]; + _name setMarkerDirLocal 0; }; GVAR(drawing_lineMarkers) pushBack (+_this); if (isServer && GVAR(drawing_syncMarkers)) then { - GVAR(drawing_serverLineMarkers) pushBack (+_this); - publicVariable QGVAR(drawing_serverLineMarkers); + GVAR(drawing_serverLineMarkers) pushBack (+_this); + publicVariable QGVAR(drawing_serverLineMarkers); }; diff --git a/addons/maptools/functions/fnc_calculateMapScale.sqf b/addons/maptools/functions/fnc_calculateMapScale.sqf index d8ed1cfcb9..700e089a88 100644 --- a/addons/maptools/functions/fnc_calculateMapScale.sqf +++ b/addons/maptools/functions/fnc_calculateMapScale.sqf @@ -1,15 +1,15 @@ /* * Author: esteldunedain - * * Returns the equivalent of 100m in screen coordinates * - * Argument: + * Arguments: * None * * Return value: - * Return + * No + * + * Public: No */ - #include "script_component.hpp" _pos = ((finddisplay 12) displayctrl 51) ctrlMapScreenToWorld [0.5, 0.5]; diff --git a/addons/maptools/functions/fnc_canDraw.sqf b/addons/maptools/functions/fnc_canDraw.sqf index a5088f668b..da55043d85 100644 --- a/addons/maptools/functions/fnc_canDraw.sqf +++ b/addons/maptools/functions/fnc_canDraw.sqf @@ -1,5 +1,15 @@ -// by esteldunedain - +/* + * Author: esteldunedain + * canDraw + * + * Arguments: + * None + * + * Return value: + * + * + * Public: No + */ #include "script_component.hpp" (missionNameSpace getVariable [QGVAR(drawing_syncMarkers), true] && {GVAR(EveryoneCanDrawOnBriefing)}) || diff --git a/addons/maptools/functions/fnc_canUseMapGPS.sqf b/addons/maptools/functions/fnc_canUseMapGPS.sqf index f3d0b10c56..381136a1cc 100644 --- a/addons/maptools/functions/fnc_canUseMapGPS.sqf +++ b/addons/maptools/functions/fnc_canUseMapGPS.sqf @@ -1,5 +1,15 @@ -// by esteldunedain - +/* + * Author: esteldunedain + * canUseMapGPS + * + * Arguments: + * None + * + * Return value: + * + * + * Public: No + */ #include "script_component.hpp" visibleMap && diff --git a/addons/maptools/functions/fnc_canUseMapTools.sqf b/addons/maptools/functions/fnc_canUseMapTools.sqf index fe0bf012da..30d86160ab 100644 --- a/addons/maptools/functions/fnc_canUseMapTools.sqf +++ b/addons/maptools/functions/fnc_canUseMapTools.sqf @@ -1,5 +1,15 @@ -// by esteldunedain - +/* + * Author: esteldunedain + * canUseMapTools + * + * Arguments: + * None + * + * Return value: + * + * + * Public: No + */ #include "script_component.hpp" visibleMap && diff --git a/addons/maptools/functions/fnc_cancelDrawing.sqf b/addons/maptools/functions/fnc_cancelDrawing.sqf index 09396e61fe..bc80602cfc 100644 --- a/addons/maptools/functions/fnc_cancelDrawing.sqf +++ b/addons/maptools/functions/fnc_cancelDrawing.sqf @@ -1,19 +1,19 @@ /* * Author: esteldunedain - * * Cancel the drawing of the current line marker * - * Argument: + * Arguments: * None * * Return value: - * Nothing + * None + * + * Public: No */ - #include "script_component.hpp" GVAR(drawing_isDrawing) = false; if (count GVAR(drawing_tempLineMarker) > 0) then { - deleteMarkerLocal (GVAR(drawing_tempLineMarker) select 0); + deleteMarkerLocal (GVAR(drawing_tempLineMarker) select 0); }; GVAR(drawing_tempLineMarker) = []; diff --git a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf index d2675a2b06..e3de77316a 100644 --- a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf +++ b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf @@ -1,23 +1,23 @@ /* * Author: esteldunedain - * * Copy recieved markers to map * - * Argument: - * 0: Array of markers to copy (Array) + * Arguments: + * 0: Array of markers to copy * * Return value: - * Return + * None + * + * Public: No */ - #include "script_component.hpp" PARAMS_1(_lineMarkers); { - _marker = _x; - //Add marker if we don't already have it - if (({(_x select 0) == (_marker select 0)} count GVAR(drawing_lineMarkers)) == 0) then { - _marker call FUNC(addLineMarker); - }; + _marker = _x; + //Add marker if we don't already have it + if (({(_x select 0) == (_marker select 0)} count GVAR(drawing_lineMarkers)) == 0) then { + _marker call FUNC(addLineMarker); + }; } forEach _lineMarkers; diff --git a/addons/maptools/functions/fnc_copyMapStart.sqf b/addons/maptools/functions/fnc_copyMapStart.sqf index 11464d7573..a39c74d225 100644 --- a/addons/maptools/functions/fnc_copyMapStart.sqf +++ b/addons/maptools/functions/fnc_copyMapStart.sqf @@ -1,11 +1,10 @@ /* * Author: esteldunedain - * * Send request to remote player * - * Argument: - * 0: Player (Unit) - * 0: Target player (Unit) + * Arguments: + * 0: Player + * 0: Target player * * Code Chain: * START: copyMapStart: triggers event drawing_requestMarkers on remote diff --git a/addons/maptools/functions/fnc_handleKeyDown.sqf b/addons/maptools/functions/fnc_handleKeyDown.sqf index 4553ed62ab..d2b3a060b8 100644 --- a/addons/maptools/functions/fnc_handleKeyDown.sqf +++ b/addons/maptools/functions/fnc_handleKeyDown.sqf @@ -1,9 +1,8 @@ /* * Author: esteldunedain - * * Handle key down on map. * - * Argument: + * Arguments: * 0: Display (display) * 1: Key code (number) * 2: Shift Key (boolean) @@ -30,45 +29,45 @@ _handled = false; // If pressed Esc while drawing if (_code == DIK_ESCAPE) exitWith { - if (GVAR(drawing_isDrawing)) then { - call FUNC(cancelDrawing); - _handled = true; - }; + if (GVAR(drawing_isDrawing)) then { + call FUNC(cancelDrawing); + _handled = true; + }; }; if (_code == DIK_DELETE) exitWith { - if (GVAR(drawing_isDrawing)) then { - call FUNC(cancelDrawing); - _handled = true; - } else { - - // Check if a line marker needs to be deleted - { - _relPos = GVAR(mousePosition) vectorDiff (_x select 1); - _diffVector = (_x select 2) vectorDiff (_x select 1); - _magDiffVector = vectorMagnitude _diffVector; - if (_magDiffVector == 0) then { - _diffVector = [10,0,0]; - _magDiffVector = vectorMagnitude _diffVector; - }; - _diffVector = _diffVector vectorMultiply (1/_magDiffVector); - - // Projection of the relative position over the longitudinal axis - _lambdaLong = _diffVector vectorDotProduct _relPos; - // Projection of the relative position over the trasversal axis - _lambdaTrasAbs = vectorMagnitude (_relPos vectorDiff (_diffVector vectorMultiply _lambdaLong)); - if (_lambdaLong >= 0 && _lambdaLong <= _magDiffVector && _lambdaTrasAbs <= 5) exitWith { - // Delete the line marker - if (GVAR(drawing_syncMarkers)) then { - ["drawing_removeLineMarker", [_x select 0]] call EFUNC(common,globalEvent); - } else { - deleteMarkerLocal (_x select 0); - GVAR(drawing_lineMarkers) = GVAR(drawing_lineMarkers) - [_x]; - }; + if (GVAR(drawing_isDrawing)) then { + call FUNC(cancelDrawing); _handled = true; - }; - } forEach GVAR(drawing_lineMarkers); - }; + } else { + + // Check if a line marker needs to be deleted + { + _relPos = GVAR(mousePosition) vectorDiff (_x select 1); + _diffVector = (_x select 2) vectorDiff (_x select 1); + _magDiffVector = vectorMagnitude _diffVector; + if (_magDiffVector == 0) then { + _diffVector = [10,0,0]; + _magDiffVector = vectorMagnitude _diffVector; + }; + _diffVector = _diffVector vectorMultiply (1/_magDiffVector); + + // Projection of the relative position over the longitudinal axis + _lambdaLong = _diffVector vectorDotProduct _relPos; + // Projection of the relative position over the trasversal axis + _lambdaTrasAbs = vectorMagnitude (_relPos vectorDiff (_diffVector vectorMultiply _lambdaLong)); + if (_lambdaLong >= 0 && _lambdaLong <= _magDiffVector && _lambdaTrasAbs <= 5) exitWith { + // Delete the line marker + if (GVAR(drawing_syncMarkers)) then { + ["drawing_removeLineMarker", [_x select 0]] call EFUNC(common,globalEvent); + } else { + deleteMarkerLocal (_x select 0); + GVAR(drawing_lineMarkers) = GVAR(drawing_lineMarkers) - [_x]; + }; + _handled = true; + }; + } forEach GVAR(drawing_lineMarkers); + }; }; _handled diff --git a/addons/maptools/functions/fnc_handleMouseMove.sqf b/addons/maptools/functions/fnc_handleMouseMove.sqf index 99c36f1581..4111c8fad4 100644 --- a/addons/maptools/functions/fnc_handleMouseMove.sqf +++ b/addons/maptools/functions/fnc_handleMouseMove.sqf @@ -22,18 +22,18 @@ GVAR(mousePosition) set [2, 0]; //convert 2d pos to 3d // If cannot draw then exit if !(call FUNC(canDraw)) exitWith { - // If was drawing, cancel - if (GVAR(drawing_isDrawing)) then { - call FUNC(cancelDrawing); - }; - false + // If was drawing, cancel + if (GVAR(drawing_isDrawing)) then { + call FUNC(cancelDrawing); + }; + false }; // Handle drawing if (GVAR(drawing_isDrawing)) exitWith { - GVAR(drawing_tempLineMarker) set [2, GVAR(mousePosition)]; - GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); - false + GVAR(drawing_tempLineMarker) set [2, GVAR(mousePosition)]; + GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); + false }; // Handle Map tools @@ -41,23 +41,23 @@ if (GVAR(mapTool_Shown) == 0) exitWith {false}; // Translation if (GVAR(mapTool_isDragging)) exitWith { - GVAR(mapTool_pos) set [0, (GVAR(mapTool_startPos) select 0) + (GVAR(mousePosition) select 0) - (GVAR(mapTool_startDragPos) select 0)]; - GVAR(mapTool_pos) set [1, (GVAR(mapTool_startPos) select 1) + (GVAR(mousePosition) select 1) - (GVAR(mapTool_startDragPos) select 1)]; + GVAR(mapTool_pos) set [0, (GVAR(mapTool_startPos) select 0) + (GVAR(mousePosition) select 0) - (GVAR(mapTool_startDragPos) select 0)]; + GVAR(mapTool_pos) set [1, (GVAR(mapTool_startPos) select 1) + (GVAR(mousePosition) select 1) - (GVAR(mapTool_startDragPos) select 1)]; - // Update the size and rotation of the maptool - [] call FUNC(updateMapToolMarkers); - true + // Update the size and rotation of the maptool + [] call FUNC(updateMapToolMarkers); + true }; // Rotation if (GVAR(mapTool_isRotating)) exitWith { - // Get new angle - _angle = (180 + ((GVAR(mousePosition) select 0) - (GVAR(mapTool_startPos) select 0)) atan2 ((GVAR(mousePosition) select 1) - (GVAR(mapTool_startPos) select 1)) mod 360); - GVAR(mapTool_angle) = GVAR(mapTool_startAngle) + _angle - GVAR(mapTool_startDragAngle); + // Get new angle + _angle = (180 + ((GVAR(mousePosition) select 0) - (GVAR(mapTool_startPos) select 0)) atan2 ((GVAR(mousePosition) select 1) - (GVAR(mapTool_startPos) select 1)) mod 360); + GVAR(mapTool_angle) = GVAR(mapTool_startAngle) + _angle - GVAR(mapTool_startDragAngle); - // Update the size and rotation of the maptool - [] call FUNC(updateMapToolMarkers); - true + // Update the size and rotation of the maptool + [] call FUNC(updateMapToolMarkers); + true }; false diff --git a/addons/maptools/functions/fnc_handleMouseZChanged.sqf b/addons/maptools/functions/fnc_handleMouseZChanged.sqf index 483efc56b7..35626238e5 100644 --- a/addons/maptools/functions/fnc_handleMouseZChanged.sqf +++ b/addons/maptools/functions/fnc_handleMouseZChanged.sqf @@ -29,16 +29,16 @@ _handled = true; // ACE_Map_drawColors is never defined /* if (count GVAR(drawing_tempLineMarker) > 0) then { - ACE_Map_drawColor = if (_dir > 0) then {ACE_Map_drawColor + 1} else {ACE_Map_drawColor - 1}; - if (ACE_Map_drawColor >= count ACE_Map_drawColors) then { +ACE_Map_drawColor = if (_dir > 0) then {ACE_Map_drawColor + 1} else {ACE_Map_drawColor - 1}; +if (ACE_Map_drawColor >= count ACE_Map_drawColors) then { ACE_Map_drawColor = ACE_Map_drawColor - count ACE_Map_drawColors; - }; - if (ACE_Map_drawColor < 0) then { +}; +if (ACE_Map_drawColor < 0) then { ACE_Map_drawColor = ACE_Map_drawColor + count ACE_Map_drawColors; - }; - GVAR(drawing_tempLineMarker) set [3, ACE_Map_drawColor]; - GVAR(drawing_tempLineMarker) call ACE_Map_fnc_updateLineMarker; +}; +GVAR(drawing_tempLineMarker) set [3, ACE_Map_drawColor]; +GVAR(drawing_tempLineMarker) call ACE_Map_fnc_updateLineMarker; - _handled = true; +_handled = true; }; */ _handled diff --git a/addons/maptools/functions/fnc_isInsideMapTool.sqf b/addons/maptools/functions/fnc_isInsideMapTool.sqf index b4d4fc8814..4dd66e2b9a 100644 --- a/addons/maptools/functions/fnc_isInsideMapTool.sqf +++ b/addons/maptools/functions/fnc_isInsideMapTool.sqf @@ -1,16 +1,14 @@ /* * Author: esteldunedain - * * Return true if the position is inside the map marker (to allow dragging). * - * Argument: - * 0: x Position (in meters) - * 1: y Position (in meters) + * Arguments: + * 0: x Position (in meters) + * 1: y Position (in meters) * * Return value: * Boolean */ - #include "script_component.hpp" #define TEXTURE_WIDTH_IN_M 6205 @@ -19,7 +17,6 @@ #define DIST_LEFT_TO_CENTER_PERC 0.30 - if (GVAR(mapTool_Shown) == 0) exitWith {false}; _textureWidth = [TEXTURE_WIDTH_IN_M, TEXTURE_WIDTH_IN_M / 2] select (GVAR(mapTool_Shown) - 1); diff --git a/addons/maptools/functions/fnc_mapStateUpdater.sqf b/addons/maptools/functions/fnc_mapStateUpdater.sqf index ffe331df71..2b4e634567 100644 --- a/addons/maptools/functions/fnc_mapStateUpdater.sqf +++ b/addons/maptools/functions/fnc_mapStateUpdater.sqf @@ -2,32 +2,32 @@ #include "script_component.hpp" if (visibleMap) then { - // Show/Hide draw buttons - if ("ACE_MapTools" in items ACE_player) then { - { ((finddisplay 12) displayctrl _x) ctrlShow true; } forEach GVAR(drawing_controls); - } else { - { ((finddisplay 12) displayctrl _x) ctrlShow false; } forEach GVAR(drawing_controls); - if (GVAR(drawing_isDrawing)) then { - call FUNC(cancelDrawing); + // Show/Hide draw buttons + if ("ACE_MapTools" in items ACE_player) then { + { ((finddisplay 12) displayctrl _x) ctrlShow true; } forEach GVAR(drawing_controls); + } else { + { ((finddisplay 12) displayctrl _x) ctrlShow false; } forEach GVAR(drawing_controls); + if (GVAR(drawing_isDrawing)) then { + call FUNC(cancelDrawing); + }; }; - }; }; //When Map is Closed: if (GVAR(mapVisableLastFrame) && (!visibleMap)) then { - GVAR(mapVisableLastFrame) = false; - // Hide GPS - [false] call FUNC(openMapGps); - // Cancel drawing - call FUNC(cancelDrawing); + GVAR(mapVisableLastFrame) = false; + // Hide GPS + [false] call FUNC(openMapGps); + // Cancel drawing + call FUNC(cancelDrawing); }; //When Map is Opened: if ((!GVAR(mapVisableLastFrame)) && (visibleMap)) then { - //todo: "mapOpened" Event???? - GVAR(mapVisableLastFrame) = true; - // Show and update map tools if required - [] call FUNC(updateMapToolMarkers); - // Show GPS if required - [GVAR(mapGpsShow)] call FUNC(openMapGps); + //todo: "mapOpened" Event???? + GVAR(mapVisableLastFrame) = true; + // Show and update map tools if required + [] call FUNC(updateMapToolMarkers); + // Show GPS if required + [GVAR(mapGpsShow)] call FUNC(openMapGps); }; diff --git a/addons/maptools/functions/fnc_openMapGps.sqf b/addons/maptools/functions/fnc_openMapGps.sqf index 03b3f5525c..c4e2436b3b 100644 --- a/addons/maptools/functions/fnc_openMapGps.sqf +++ b/addons/maptools/functions/fnc_openMapGps.sqf @@ -1,25 +1,24 @@ /* -* Author: esteldunedain -* -* Opens or closes the gps on the map screen, showing coordinates -* -* Argument: -* 0: Open GPS? (Boolean) -* -* Return value: -* Nothing -*/ - + * Author: esteldunedain + * Opens or closes the gps on the map screen, showing coordinates + * + * Arguments: + * 0: Open GPS? + * + * Return value: + * Nothing + * + * Public: No + */ #include "script_component.hpp" _shouldOpenGps = _this select 0; _isOpen = !(isNull (uiNamespace getVariable [QGVAR(ui_mapGpsDisplay), displayNull])); if (_shouldOpenGps && {"ItemGPS" in assignedItems ACE_player} && {!_isOpen}) then { - ("RscACE_MapGps" call BIS_fnc_rscLayer) cutRsc ["RscACE_MapGps","PLAIN"]; + ("RscACE_MapGps" call BIS_fnc_rscLayer) cutRsc ["RscACE_MapGps","PLAIN"]; - [FUNC(openMapGpsUpdate), 0.5, []] call CBA_fnc_addPerFrameHandler; //update bearing/altitude every 0.5 sec (ticktime) + [FUNC(openMapGpsUpdate), 0.5, []] call CBA_fnc_addPerFrameHandler; //update bearing/altitude every 0.5 sec (ticktime) } else { - ("RscACE_MapGps" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; + ("RscACE_MapGps" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; }; - diff --git a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf index a26a02dd34..ddc177f182 100644 --- a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf +++ b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf @@ -11,8 +11,8 @@ disableSerialization; _mapGpsDisplay = uiNamespace getVariable [QGVAR(ui_mapGpsDisplay), displayNull]; _ctrl = _mapGpsDisplay displayCtrl 913590; -_ctrl ctrlSetText str(round(getDir player)); //set Heading +_ctrl ctrlSetText str(round(getDir ACE_player)); //set Heading _ctrl = _mapGpsDisplay displayCtrl 913591; -_ctrl ctrlSetText str(round((getPosASL player) select 2)); //set Altitude +_ctrl ctrlSetText str(round((getPosASL ACE_player) select 2)); //set Altitude _ctrl = _mapGpsDisplay displayCtrl 913592; -_ctrl ctrlSetText mapGridPosition player; //set grid cords +_ctrl ctrlSetText mapGridPosition ACE_player; //set grid cords diff --git a/addons/maptools/functions/fnc_removeLineMarker.sqf b/addons/maptools/functions/fnc_removeLineMarker.sqf index 15af48217e..45c39611db 100644 --- a/addons/maptools/functions/fnc_removeLineMarker.sqf +++ b/addons/maptools/functions/fnc_removeLineMarker.sqf @@ -1,10 +1,9 @@ /* * Author: esteldunedain - * * Remove the line marker * - * Argument: - * 0: Marker Name (string) + * Arguments: + * 0: Marker Name * * Return value: * Return @@ -12,20 +11,20 @@ #include "script_component.hpp" - _name = _this select 0; +_name = _this select 0; - deleteMarkerLocal _name; +deleteMarkerLocal _name; { - if ((_x select 0) == _name) exitWith { - GVAR(drawing_lineMarkers) = GVAR(drawing_lineMarkers) - [_x]; - }; + if ((_x select 0) == _name) exitWith { + GVAR(drawing_lineMarkers) = GVAR(drawing_lineMarkers) - [_x]; + }; } forEach GVAR(drawing_lineMarkers); if (isServer && GVAR(drawing_syncMarkers)) then { - { - if ((_x select 0) == _name) exitWith { - GVAR(drawing_serverLineMarkers) = GVAR(drawing_serverLineMarkers) - [_x]; - publicVariable QGVAR(drawing_serverLineMarkers); - }; - } forEach GVAR(drawing_serverLineMarkers); + { + if ((_x select 0) == _name) exitWith { + GVAR(drawing_serverLineMarkers) = GVAR(drawing_serverLineMarkers) - [_x]; + publicVariable QGVAR(drawing_serverLineMarkers); + }; + } forEach GVAR(drawing_serverLineMarkers); }; diff --git a/addons/maptools/functions/fnc_updateLineMarker.sqf b/addons/maptools/functions/fnc_updateLineMarker.sqf index 9635dc02fa..cf80c1ac26 100644 --- a/addons/maptools/functions/fnc_updateLineMarker.sqf +++ b/addons/maptools/functions/fnc_updateLineMarker.sqf @@ -1,24 +1,22 @@ /* * Author: esteldunedain - * * Updates the line marker position and scale * - * Argument: - * 0: Marker Name (string) - * 1: Marker start pos (array) - * 2: Marker end pos (array) - * 3: Color index (Number) + * Arguments: + * 0: Marker Name + * 1: Marker start pos + * 2: Marker end pos + * 3: Color index * * Return value: - * Return + * None */ - #include "script_component.hpp" - _name = _this select 0; - _startPos = _this select 1; - _difPos = (_this select 2) vectorDiff _startPos ; - _color = _this select 3; +_name = _this select 0; +_startPos = _this select 1; +_difPos = (_this select 2) vectorDiff _startPos ; +_color = _this select 3; _name setMarkerShapeLocal "RECTANGLE"; _name setMarkerAlphaLocal 1; @@ -26,9 +24,9 @@ _name setMarkerColorLocal GVAR(drawing_drawColor); _name setMarkerPosLocal (_startPos vectorAdd (_difPos vectorMultiply 0.5)); _mag = vectorMagnitude _difPos; if (_mag > 0) then { - _name setMarkerSizeLocal [5, _mag / 2]; - _name setMarkerDirLocal (180 + (_difPos select 0) atan2 (_difPos select 1) mod 360); + _name setMarkerSizeLocal [5, _mag / 2]; + _name setMarkerDirLocal (180 + (_difPos select 0) atan2 (_difPos select 1) mod 360); } else { - _name setMarkerSizeLocal [5, 5]; - _name setMarkerDirLocal 0; + _name setMarkerSizeLocal [5, 5]; + _name setMarkerDirLocal 0; }; diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index 13967413f6..3a7b919b8b 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -7,8 +7,9 @@ * * Return value: * Nothing + * + * Public: No */ - #include "script_component.hpp" #define TEXTURE_WIDTH_IN_M 6205 diff --git a/addons/maptools/script_component.hpp b/addons/maptools/script_component.hpp index df2a8d3f62..30a9f83d0d 100644 --- a/addons/maptools/script_component.hpp +++ b/addons/maptools/script_component.hpp @@ -10,8 +10,3 @@ #endif #include "\z\ace\Addons\main\script_macros.hpp" - - -#define MARKERNAME_MAPTOOL_FIXED "ACE_MapToolFixed" -#define MARKERNAME_MAPTOOL_ROTATINGNORMAL "ACE_MapToolRotatingNormal" -#define MARKERNAME_MAPTOOL_ROTATINGSMALL "ACE_MapToolRotatingSmall" From d060b13bbeaa104f4cf976487640abe9e02df187 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 15:47:12 -0500 Subject: [PATCH 16/26] #86 - Stretch gps info box to support 8 digits --- addons/maptools/MapGpsUI.hpp | 8 ++++---- addons/maptools/UI/mapGps.paa | Bin 34174 -> 37350 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/maptools/MapGpsUI.hpp b/addons/maptools/MapGpsUI.hpp index ff8ec8b96e..170f0d1620 100644 --- a/addons/maptools/MapGpsUI.hpp +++ b/addons/maptools/MapGpsUI.hpp @@ -31,7 +31,7 @@ class RscTitles { }; class heading: RscText{ idc = 913590; - x = X_gps + W_gps * 0.25; + x = X_gps + W_gps * 0.225; y = Y_gps + H_gps * 0.12; w = W_gps * 0.2; h = H_gps * 0.16; @@ -46,7 +46,7 @@ class RscTitles { }; class altitude: RscText{ idc = 913591; - x = X_gps + W_gps * 0.55; + x = X_gps + W_gps * 0.575; y = Y_gps + H_gps * 0.12; w = W_gps * 0.2; h = H_gps * 0.16; @@ -61,9 +61,9 @@ class RscTitles { }; class coordinates: RscText{ idc = 913592; - x = X_gps + W_gps * 0.2; + x = X_gps + W_gps * 0.15; y = Y_gps + H_gps * 0.33; - w = W_gps * 0.6; + w = W_gps * 0.7; h = H_gps * 0.35; style = ST_CENTER; text = "012.3 115.1"; diff --git a/addons/maptools/UI/mapGps.paa b/addons/maptools/UI/mapGps.paa index f4ed1dfc5492fe773000917998ead184345e966f..defcdbc63bd398ec89b79bb7c9aed3cb3adc3f1b 100644 GIT binary patch literal 37350 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 literal 34174 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 Date: Tue, 7 Apr 2015 23:02:54 +0200 Subject: [PATCH 17/26] light intensity from object: handle campfires --- addons/common/functions/fnc_lightIntensityFromObject.sqf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/addons/common/functions/fnc_lightIntensityFromObject.sqf b/addons/common/functions/fnc_lightIntensityFromObject.sqf index f9749ab8a0..98e7935f9f 100644 --- a/addons/common/functions/fnc_lightIntensityFromObject.sqf +++ b/addons/common/functions/fnc_lightIntensityFromObject.sqf @@ -96,6 +96,14 @@ if (_lightSource isKindOf "CAManBase") then { } forEach _lights; + // handle campfires + if (inflamed _lightSource) then { + private "_distance"; + _distance = _unitPos distance position _lightSource; + + _lightLevel = _lightLevel max linearConversion [0, 30, _distance, 0.5, 0, true]; + }; + }; _lightLevel From 2f4335d3c28062579cb4aa541fea7ecab3dcc57c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 17:14:27 -0500 Subject: [PATCH 18/26] #344 - Ignore missing ace_serverconfig on client --- addons/common/scripts/Version/checkVersionNumber.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/scripts/Version/checkVersionNumber.sqf b/addons/common/scripts/Version/checkVersionNumber.sqf index 87b89a8b6b..467ebd9c1a 100644 --- a/addons/common/scripts/Version/checkVersionNumber.sqf +++ b/addons/common/scripts/Version/checkVersionNumber.sqf @@ -81,7 +81,7 @@ if (!isServer) then { _index = _files find _x; if (_index == -1) then { - _missingAddons pushBack _x; + if (_x != "ace_serverconfig") then {_missingAddons pushBack _x;}; } else { _clientVersion = _versions select _index; From 50dbbda8ebacef8995459073326dd7a9aef08230 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 8 Apr 2015 00:20:43 +0200 Subject: [PATCH 19/26] disable cursor showing map position --- addons/common/RscInfoType.hpp | 18 ++++++++++++++++++ addons/common/XEH_preInit.sqf | 10 ++++++++++ 2 files changed, 28 insertions(+) diff --git a/addons/common/RscInfoType.hpp b/addons/common/RscInfoType.hpp index fe21b05265..429d1d7b02 100644 --- a/addons/common/RscInfoType.hpp +++ b/addons/common/RscInfoType.hpp @@ -28,3 +28,21 @@ class RscDisplayInventory { class RscDisplayChannel { onLoad = QUOTE(_this call FUNC(onLoadRscDisplayChannel)); }; + +// map +class RscDisplayMainMap { + onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDiary"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgMap', _this select 0)]; [ARR_2('mapDisplayLoaded', [ARR_2(_this select 0, 'Ingame')])] call FUNC(localEvent);); +}; + +class RscDisplayGetReady: RscDisplayMainMap { + onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDiary"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgMap', _this select 0)]; [ARR_2('mapDisplayLoaded', [ARR_2(_this select 0, 'Briefing')])] call FUNC(localEvent);); +}; + +class RscDisplayServerGetReady: RscDisplayGetReady { + onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDiary"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgMap', _this select 0)]; [ARR_2('mapDisplayLoaded', [ARR_2(_this select 0, 'ServerBriefing')])] call FUNC(localEvent);); +}; + + +class RscDisplayClientGetReady: RscDisplayGetReady { + onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDiary"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgMap', _this select 0)]; [ARR_2('mapDisplayLoaded', [ARR_2(_this select 0, 'ClientBriefing')])] call FUNC(localEvent);); +}; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index b7da27ea75..98b0d17c7d 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -283,6 +283,16 @@ if (hasInterface) then { ["playerChanged", [ACE_player, _oldPlayer]] call FUNC(localEvent); }; }, 0, []] call cba_fnc_addPerFrameHandler; + + // doesn't work on postInit in SP + ["mapDisplayLoaded", { + //hint str _this; systemChat str _this; diag_log str _this; + + if (_this select 1 == "ingame") then { + ((_this select 0) displayCtrl 1016) ctrlShow false; + }; + }] call FUNC(addEventhandler); + }; // Init toHex From 4834facccf64ab01443362c0220be2155e9e7358 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 8 Apr 2015 00:30:36 +0200 Subject: [PATCH 20/26] moving it to map --- addons/common/XEH_preInit.sqf | 10 ---------- addons/map/XEH_postInitClient.sqf | 9 +++++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 98b0d17c7d..b7da27ea75 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -283,16 +283,6 @@ if (hasInterface) then { ["playerChanged", [ACE_player, _oldPlayer]] call FUNC(localEvent); }; }, 0, []] call cba_fnc_addPerFrameHandler; - - // doesn't work on postInit in SP - ["mapDisplayLoaded", { - //hint str _this; systemChat str _this; diag_log str _this; - - if (_this select 1 == "ingame") then { - ((_this select 0) displayCtrl 1016) ctrlShow false; - }; - }] call FUNC(addEventhandler); - }; // Init toHex diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index ccaf9041ab..778b1c8191 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -19,4 +19,13 @@ call FUNC(determineZoom); ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}]; }; +// doesn't work on postInit in SP +["mapDisplayLoaded", { + hint str _this; systemChat str _this; diag_log str _this;// + + if (_this select 1 == "ingame") then { + ((_this select 0) displayCtrl 1016) ctrlShow false; + }; +}] call FUNC(addEventhandler); + ADDON = true; From 691ab012b4a1cbc1d7201160c10c7ae22061e95a Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 8 Apr 2015 00:44:14 +0200 Subject: [PATCH 21/26] fix map loaded on preInit --- addons/map/XEH_postInitClient.sqf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index 778b1c8191..f60fb696f6 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -19,12 +19,14 @@ call FUNC(determineZoom); ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}]; }; -// doesn't work on postInit in SP +// Note: doesn't work on postInit in SP, therefore use default setting +(findDisplay 12 displayCtrl 1016) ctrlShow (GETGVAR(showPositionOnCursor,false)); + ["mapDisplayLoaded", { - hint str _this; systemChat str _this; diag_log str _this;// + //hint str _this; systemChat str _this; diag_log str _this; if (_this select 1 == "ingame") then { - ((_this select 0) displayCtrl 1016) ctrlShow false; + ((_this select 0) displayCtrl 1016) ctrlShow (GETGVAR(showPositionOnCursor,false)); }; }] call FUNC(addEventhandler); From 29d9da9f4d0dbcfa942d50a5f95e24d448abca4b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 22:05:15 -0500 Subject: [PATCH 22/26] Include needed CBA file prerec Dragging needs this to compile --- tools/cba/addons/xeh/init_pre.sqf | 358 ++++++++++++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 tools/cba/addons/xeh/init_pre.sqf diff --git a/tools/cba/addons/xeh/init_pre.sqf b/tools/cba/addons/xeh/init_pre.sqf new file mode 100644 index 0000000000..8e6a31f8c8 --- /dev/null +++ b/tools/cba/addons/xeh/init_pre.sqf @@ -0,0 +1,358 @@ +// #define DEBUG_MODE_FULL +#include "script_component.hpp" +SCRIPT(init_pre); + +if !(isNil'SLX_XEH_MACHINE') exitWith {}; // Doublecheck.. + +LOG(MSG_INIT); +// No _this in pre/PostInit, also fixes call to init_compile +private "_this"; +_this = nil; + +private ["_id", "_cfgRespawn", "_respawn", "_level"]; + +// UNIQUE Session ID since start of game +_id = uiNamespace getVariable "SLX_XEH_ID"; +if (isNil "_id") then { _id = 1 } else { if (typeName _id != "SCALAR") then { _id = 0 }; if (_id < 0) then { _id = 0 }; INC(_id) }; +uiNamespace setVariable ["SLX_XEH_ID", _id]; + +CBA_isCached = uiNamespace getVariable "CBA_isCached"; +CBA_isCached = if (isNil "CBA_isCached" && {isMultiplayer} && {!isDedicated}) then { -1 } else { _id }; +uiNamespace setVariable ["CBA_isCached", CBA_isCached]; + +if (isNil "SLX_XEH_RECOMPILE") then { SLX_XEH_RECOMPILE = CACHE_DIS(xeh) }; + +if (!isMultiplayer || {isDedicated} || {CBA_isCached == -1}) then { + uiNamespace setVariable ["SLX_XEH_CACHE_KEYS", []]; + uiNamespace setVariable ["SLX_XEH_CACHE_KEYS2", []]; + uiNamespace setVariable ["SLX_XEH_CACHE_KEYS3", []]; + uiNamespace setVariable ["CBA_CACHE_KEYS", []]; +}; + +SLX_XEH_CACHE_KEYS = uiNamespace getVariable "SLX_XEH_CACHE_KEYS"; +SLX_XEH_CACHE_KEYS2 = uiNamespace getVariable "SLX_XEH_CACHE_KEYS2"; +SLX_XEH_CACHE_KEYS3 = uiNamespace getVariable "SLX_XEH_CACHE_KEYS3"; +CBA_CACHE_KEYS = uiNamespace getVariable "CBA_CACHE_KEYS"; + +// Always compile cache function once +call compile preProcessFileLineNumbers 'x\cba\addons\xeh\init_compile.sqf'; + +// Log +SLX_XEH_DisableLogging = isClass(configFile/"CfgPatches"/"Disable_XEH_Logging"); + +// Backup functions for macros +// TODO: Cleanup... +// CBA_fnc_log = { diag_log [diag_frameNo, diag_tickTime, time, _this] }; + + +/* CBA_fnc_defaultParam = { + PARAMS_3(_params,_index,_defaultValue); + + private "_value"; + + if (!isNil "_defaultValue") then { + _value = _defaultValue; + }; + + if (!isNil "_params" && {(typeName _params) == "ARRAY"} && {count _params > _index} && {!isNil { _params select _index }}) then { + _value = _params select _index; + }; + + // Return. + if (isNil "_value") then { + nil; + } else { + _value; + }; +}; +*/ + +XEH_LOG("XEH: PreInit Started. v"+getText(configFile >> "CfgPatches" >> "CBA_XEH" >> "version")+". "+PFORMAT_5("MISSINIT",missionName,worldName,isMultiplayer,isServer,isDedicated)); +if (time > 0) then { XEH_LOG("XEH WARNING: Time > 0; This probably means there are no XEH compatible units by default on the map, perhaps add the SLX_XEH_Logic module.") }; + +// Compile all necessary scripts and start one vehicle crew initialisation thread +_cfgRespawn = (missionConfigFile/"respawn"); +_respawn = false; +if ( isNumber(_cfgRespawn) ) then { + _respawn = !(getNumber(_cfgRespawn) in [0, 1, 4, 5]); +}; +if ( isText(_cfgRespawn) ) then { + _respawn = !(getText(_cfgRespawn) in ["none", "bird", "group", "side"]); +}; + +SLX_XEH_objects = []; // Temporary array, to track InitPosts at mission initialization +SLX_XEH_INIT_MEN = []; // Temporary array, to track ManBased inits - to workaround JIP issue "Double init eh ran for crew units" +SLX_XEH_DELAYED = []; // Temporary array, to track Delayed Inits at mission initialization + + +// Game version detection +_level = 0; // pre v1.60 +// TODO: Improve v1.60 detection +// TODO: Temporary disabled due to #28652 +//if ((isNumber (configFile >> "CfgDifficulties" >> "recruit" >> "recoilCoef")) && (isNumber (configFile >> "CfgVehicles" >> "Car" >> "turnCoef"))) then { + //_level = 1; // v1.60 +//}; + +FUNC(determineProductVersion) = { + private "_pv"; + _pv = call {productVersion}; + + // A2 (and OA pre 1.61beta, and TOH pre 1.05?) does not support productVersion so we deal with it manually + if (isNil "_pv") then { + _pv = if (isClass(configFile >> "CfgPatches" >> "A3_Map_Stratis")) then { + // A3 Backup + ["Arma 3 Alpha","Arma3Alpha", -1, -1]; //,5,102571] + + } else { + if (isClass(configFile >> "CfgPatches" >> "United_States_H")) then { + // TOH Backup + ["TakeOn H", "TakeOnH", -1, -1]; + } else { + if (isClass(configFile >> "CfgPatches" >> "Takistan")) then { + // OA Backup + ["ArmA 2OA", "ArmA2OA", -1, -1]; + } else { + // A2 Backup + ["ArmA 2", "ArmA2", -1, -1]; + }; + }; + }; + }; + + _pv; +}; + +FUNC(determineGame) = { + // 0 = A2 + // 1 = OA + // 2 = TOH + // 3 = A3 :P + private "_pv"; + _pv = call FUNC(determineProductVersion); + + switch (_pv select 1) do { + case "ArmA2": {0}; + case "ArmA2OA": {1}; + case "TakeOnH": {2}; + case "Arma3Alpha": {3}; + case "Arma3": {3}; + default {0}; + }; +}; + +// System array with machine / mission / session information +SLX_XEH_MACHINE = +[ + !isDedicated, // 0 - isClient (and thus has player) + false, // 1 - isJip + !isServer, // 2 - isDedicatedClient (and thus not a Client-Server) + isServer, // 3 - isServer + isDedicated, // 4 - isDedicatedServer (and thus not a Client-Server) + false, // 5 - Player Check Finished + !isMultiplayer, // 6 - SP? + false, // 7 - StartInit Passed + false, // 8 - Postinit Passed + isMultiplayer && {_respawn}, // 9 - Multiplayer && respawn? + if (isDedicated) then { 0 } else { if (isServer) then { 1 } else { 2 } }, // 10 - Machine type (only 3 possible configurations) + _id, // 11 - SESSION_ID + _level, // 12 - LEVEL - Used for version determination + false, // 13 - TIMEOUT - PostInit timedOut + call FUNC(determineGame), // 14 - Game + call FUNC(determineProductVersion) // 15 - Product+Version +]; + +SLX_XEH_DUMMY = switch (SLX_XEH_MACHINE select 14) do { + case 2: {"Helipad_Invisible_H" }; + case 3: {"Land_HelipadEmpty_F" }; + default { "HeliHEmpty" }; +}; + +SLX_XEH_STR = ""; // Empty string +SLX_XEH_STR_INIT_EH = "Extended_Init_EventHandlers"; +SLX_XEH_STR_INIT_POST_EH = "Extended_InitPost_EventHandlers"; +SLX_XEH_STR_PreInit = "Extended_PreInit_EventHandlers"; +SLX_XEH_STR_PostInit = "Extended_PostInit_EventHandlers"; +SLX_XEH_STR_DEH = "DefaultEventhandlers"; +SLX_XEH_STR_TAG = "SLX_XEH_"; +SLX_XEH_STR_PLAYABLE = "SLX_XEH_PLAYABLE"; + +SLX_XEH_STR_PROCESSED = "SLX_XEH_PROCESSED"; +SLX_XEH_AR_FALSE = [SLX_XEH_STR_PROCESSED, false]; +SLX_XEH_AR_TRUE = [SLX_XEH_STR_PROCESSED, true]; + +SLX_XEH_OTHER_EVENTS = [XEH_EVENTS,XEH_CUSTOM_EVENTS]; // All events except the init event +SLX_XEH_OTHER_EVENTS_FULL = []; +{ SLX_XEH_OTHER_EVENTS_FULL pushBack format["Extended_%1_EventHandlers", _x] } forEach SLX_XEH_OTHER_EVENTS; +SLX_XEH_OTHER_EVENTS_XEH = []; +{ SLX_XEH_OTHER_EVENTS_XEH pushBack format["Extended_%1EH", _x] } forEach SLX_XEH_OTHER_EVENTS; +SLX_XEH_OTHER_EVENTS_XEH_PLAYERS = []; +{ SLX_XEH_OTHER_EVENTS_XEH_PLAYERS pushBack format["Extended_%1EH_Player", _x] } forEach SLX_XEH_OTHER_EVENTS; +SLX_XEH_OTHER_EVENTS_PLAYERS = []; + +// HitPart is special in that the passed parameter to the event handler is an array of arrays +{ + if (_x == "HitPart") then + { + SLX_XEH_OTHER_EVENTS_PLAYERS pushBack (compile format["{ { _this call _x } forEach (((_this select 0) select 0) getVariable [SLX_XEH_STR_%1_Player,[]]) }",_x]) + } + else + { + SLX_XEH_OTHER_EVENTS_PLAYERS pushBack (compile format["{ { _this call _x } forEach ((_this select 0) getVariable [SLX_XEH_STR_%1_Player,[]]) }",_x]) + } +} forEach SLX_XEH_OTHER_EVENTS; + +SLX_XEH_CONFIG_FILES = [configFile, campaignConfigFile, missionConfigFile]; +SLX_XEH_CONFIG_FILES_VARIABLE = [campaignConfigFile, missionConfigFile]; + +SLX_XEH_DEF_CLASSES = [SLX_XEH_STR, "All"]; + +// XEH for non XEH supported addons +// Only works until someone uses removeAllEventhandlers on the object +// Only works if there is at least 1 XEH-enabled object on the Map - Place SLX_XEH_Logic to make sure XEH initializes. +// TODO: Perhaps do a config verification - if no custom eventhandlers detected in _all_ CfgVehicles classes, don't run this XEH handler - might be too much processing. +SLX_XEH_EVENTS_NAT = [XEH_EVENTS]; +SLX_XEH_EVENTS_FULL_NAT = []; +{ SLX_XEH_EVENTS_FULL_NAT pushBack format["Extended_%1_EventHandlers", _x] } forEach SLX_XEH_EVENTS_NAT; + +SLX_XEH_EXCLUDES = []; // TODO: Anything else?? - Ammo crates for instance have no XEH by default due to crashes) - however, they don't appear in 'vehicles' list anyway. +SLX_XEH_CLASSES = []; // Used to cache classes that have full XEH setup - TODO: Performance test.. Could use object with a variable space, classname as key +SLX_XEH_FULL_CLASSES = []; // Used to cache classes that NEED full XEH setup +SLX_XEH_EXCL_CLASSES = []; // Used for exclusion classes + + +// Function Compilation +SLX_XEH_LOG = { XEH_LOG(_this); }; + +PREP(init_once); // Pre and PostInits + +PREP(init_delayed); +PREP(init_playable); + +// Inits and InitPosts +PREP(init); +PREP(init_enum); +PREP(init_enum_cache); +PREP(init_post); + +// Init Others +PREP(init_others); +PREP(init_others_enum); +PREP(init_others_enum_cache); + +PREP(addPlayerEvents); // Add / Remove the playerEvents +PREP(removePlayerEvents); +PREP(support_monitor); +PREP(support_monitor2); + +call COMPILE_FILE(init_eh); // All XEH Event functions + + +/* +* Process the crews of vehicles. This "thread" will run just +* before PostInit and the mission init.sqf is processed. The order of execution is +* +* 1) all config.cpp init EHs (including all Extended_Init_Eventhandlers) +* 2) all the init lines in the mission.sqm +* 3) spawn:ed "threads" are started +* 4) the mission's init.sqf/sqs is run +*/ + +GVAR(init_obj) = SLX_XEH_DUMMY createVehicleLocal [0, 0, 0]; +GVAR(init_obj) addEventHandler ["killed", { + #ifdef DEBUG_MODE_FULL + XEH_LOG("XEH: VehicleCrewInit: "+str(count vehicles)); + #endif + + { + _sim = getText(configFile/"CfgVehicles"/(typeOf _x)/"simulation"); + _crew = crew _x; + /* + * If it's a vehicle then start event handlers for the crew. + * (Vehicles have crew and are neither humanoids nor game logics) + */ + if (count _crew > 0 && {{ _sim == _x }count["soldier", "invisible"] == 0}) then { + { if !(_x in SLX_XEH_INIT_MEN) then { [_x] call SLX_XEH_EH_Init } } forEach _crew; + }; + } forEach vehicles; + SLX_XEH_INIT_MEN = nil; + + deleteVehicle GVAR(init_obj);GVAR(init_obj) = nil +}]; + +GVAR(init_obj) setDamage 1; // Schedule to run itsy bitsy later + +// Prepare postInit +GVAR(init_obj2) = SLX_XEH_DUMMY createVehicleLocal [0, 0, 0]; +GVAR(init_obj2) addEventHandler ["killed", { + call COMPILE_FILE(init_post); + deleteVehicle GVAR(init_obj2);GVAR(init_obj2) = nil; +}]; + +// Schedule PostInit +SLX_XEH_STR spawn { + // Warn if PostInit takes longer than 10 tickTime seconds + SLX_XEH_STR spawn { + private["_time2Wait"]; + _time2Wait = diag_ticktime + 10; + waituntil {diag_ticktime > _time2Wait}; + if !(SLX_XEH_MACHINE select 8) then { + XEH_LOG("WARNING: PostInit did not finish in a timely fashion"); + waitUntil {time > 0}; + // Consider there will be no player if neither PostInit-Ready, nor PlayerCheck-Ready + if !(SLX_XEH_MACHINE select 8 || {SLX_XEH_MACHINE select 5}) then { SLX_XEH_MACHINE set [13, true]; }; + }; + }; + + // On Server + Non JIP Client, we are now after all objects have inited + // and at the briefing, still time == 0 + if (isNull player) then { + #ifdef DEBUG_MODE_FULL + "NULL PLAYER" call SLX_XEH_LOG; + #endif + if !((SLX_XEH_MACHINE select 4) || {(SLX_XEH_MACHINE select 6)}) then { // only if MultiPlayer and not dedicated + #ifdef DEBUG_MODE_FULL + "JIP" call SLX_XEH_LOG; + #endif + + SLX_XEH_MACHINE set [1, true]; // set JIP + // TEST for weird jip-is-server-issue :S + if (!(SLX_XEH_MACHINE select 2) || {SLX_XEH_MACHINE select 3} || {SLX_XEH_MACHINE select 4}) then { + str(["WARNING: JIP Client, yet wrong detection", SLX_XEH_MACHINE]) call SLX_XEH_LOG; + SLX_XEH_MACHINE set [2, true]; // set Dedicated client + SLX_XEH_MACHINE set [3, false]; // set server + SLX_XEH_MACHINE set [4, false]; // set dedicatedserver + }; + waitUntil { !(isNull player) || {SLX_XEH_MACHINE select 13} }; + if (SLX_XEH_MACHINE select 13) then { XEH_LOG("WARNING: TimedOut waiting for player object to be ready. Continueing PostInit without Player ready") }; + }; + }; + + if !(isNull player) then { + if (isNull (group player) && {player isKindOf "CAManBase"}) then { + // DEBUG TEST: Crashing due to JIP, or when going from briefing + // into game + #ifdef DEBUG_MODE_FULL + "NULLGROUP" call SLX_XEH_LOG; + #endif + waitUntil { !(isNull (group player)) }; + }; + waitUntil { local player }; + }; + + GVAR(init_obj2) setDamage 1; // Schedule to run itsy bitsy later + + SLX_XEH_MACHINE set [5, true]; // set player check = complete +}; + +// Load and call any "pre-init", run-once event handlers +/* + Compile code strings in the Extended_PreInit_EventHandlers class and call + them. This is done once per mission and before any extended init event + handler code is run. An addon maker can put run-once initialisation code + in such a pre-init "EH" rather than in a normal XEH init EH which might be + called several times. +*/ +{ (_x/SLX_XEH_STR_PreInit) call FUNC(init_once) } forEach SLX_XEH_CONFIG_FILES; + + +XEH_LOG("XEH: PreInit Finished. " + PFORMAT_3("CACHE DISABLED? (Disable caching with cba_cache_disable.pbo)",SLX_XEH_RECOMPILE,CBA_COMPILE_RECOMPILE,CBA_FUNC_RECOMPILE)); From ca1bafcc79c46bb1a1bcedbd711fded00947db09 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Tue, 7 Apr 2015 20:36:19 -0700 Subject: [PATCH 23/26] Improved usage of the registry for path to CfgConvert.exe and MikeRo Tools --- .../pabstFrankensteinBuilder.py | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tools/ace_build_tool/pabstFrankensteinBuilder.py b/tools/ace_build_tool/pabstFrankensteinBuilder.py index 09b12a5dc3..f58f192a53 100644 --- a/tools/ace_build_tool/pabstFrankensteinBuilder.py +++ b/tools/ace_build_tool/pabstFrankensteinBuilder.py @@ -188,10 +188,16 @@ def find_bi_tools(work_drive): else: raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") -def find_depbo_tools(): +def find_depbo_tools(regKey): """Use registry entries to find DePBO-based tools.""" + stop = False + + if regKey == "HKCU": + reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) + stop = True + else: + reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) try: k = winreg.OpenKey(reg, r"Software\Mikero\pboProject") try: @@ -217,7 +223,10 @@ def find_depbo_tools(): except: print_error("Could not find makepbo.") except: - raise Exception("BadDePBO", "DePBO tools not installed correctly") + if stop == True: + raise Exception("BadDePBO", "DePBO tools not installed correctly") + return -1 + #Strip any quotations from the path due to a MikeRo tool bug which leaves a trailing space in some of its registry paths. return [pboproject_path.strip('"'),rapify_path.strip('"'),makepbo_path.strip('"')] @@ -439,7 +448,9 @@ See the make.cfg file for additional build options. if build_tool == "pboproject": try: - depbo_tools = find_depbo_tools() + depbo_tools = find_depbo_tools("HKLM") + if depbo_tools == -1: + depbo_tools = find_depbo_tools("HKCU") pboproject = depbo_tools[0] rapifyTool = depbo_tools[1] makepboTool = depbo_tools[2] @@ -580,7 +591,7 @@ See the make.cfg file for additional build options. os.chdir("P:\\") - cmd = [os.path.join(work_drive, "CfgConvert", "CfgConvert.exe"), "-bin", "-dst", os.path.join(work_drive, prefix, module, "config.bin"), os.path.join(work_drive, prefix, module, "config.cpp")] + cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-bin", "-dst", os.path.join(work_drive, prefix, module, "config.bin"), os.path.join(work_drive, prefix, module, "config.cpp")] ret = subprocess.call(cmd) #ret = subprocess.call(["cfgConvertGUI.exe", os.path.join(work_drive, prefix, module, "config.cpp")]) @@ -589,7 +600,7 @@ See the make.cfg file for additional build options. input("Press Enter to continue...") - cmd = [os.path.join(work_drive, "CfgConvert", "CfgConvert.exe"), "-txt", "-dst", os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.bin")] + cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-txt", "-dst", os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.bin")] ret = subprocess.call(cmd) if ret != 0: print_error("CfgConvert -txt) return code == " + str(ret)) From b18bcf883565f7a0bc4750643f5be82ac9b25889 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Wed, 8 Apr 2015 01:49:56 -0300 Subject: [PATCH 24/26] Add option to turn on/off cursor coordinates --- addons/map/CfgVehicles.hpp | 9 +++++++++ addons/map/XEH_postInitClient.sqf | 4 ++-- addons/map/config.cpp | 4 ++++ addons/map/functions/fnc_moduleMap.sqf | 7 ++++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/addons/map/CfgVehicles.hpp b/addons/map/CfgVehicles.hpp index b8d3a54d96..612cadb006 100644 --- a/addons/map/CfgVehicles.hpp +++ b/addons/map/CfgVehicles.hpp @@ -36,6 +36,15 @@ class CfgVehicles { class No { name = "No"; value = 0; default = 1;}; }; }; + class MapShowCursorCoordinates { + displayName = "Show cursor coordinates?"; + description = "Show the grid coordinates on the mouse pointer?"; + typeName = "BOOL"; + class values { + class Yes { name = "Yes"; value = 1; }; + class No { name = "No"; value = 0; default = 1;}; + }; + }; }; }; diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index f60fb696f6..c6a2c572ad 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -20,13 +20,13 @@ call FUNC(determineZoom); }; // Note: doesn't work on postInit in SP, therefore use default setting -(findDisplay 12 displayCtrl 1016) ctrlShow (GETGVAR(showPositionOnCursor,false)); +(findDisplay 12 displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); ["mapDisplayLoaded", { //hint str _this; systemChat str _this; diag_log str _this; if (_this select 1 == "ingame") then { - ((_this select 0) displayCtrl 1016) ctrlShow (GETGVAR(showPositionOnCursor,false)); + ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); }; }] call FUNC(addEventhandler); diff --git a/addons/map/config.cpp b/addons/map/config.cpp index e544a67c12..d9dae47bd3 100644 --- a/addons/map/config.cpp +++ b/addons/map/config.cpp @@ -48,6 +48,10 @@ class ACE_Settings { value = 0; typeName = "BOOL"; }; + class GVAR(mapShowCursorCoordinates) { + value = 0; + typeName = "BOOL"; + }; }; #include "CfgEventHandlers.hpp" diff --git a/addons/map/functions/fnc_moduleMap.sqf b/addons/map/functions/fnc_moduleMap.sqf index b6e556c92e..a22bbbb385 100644 --- a/addons/map/functions/fnc_moduleMap.sqf +++ b/addons/map/functions/fnc_moduleMap.sqf @@ -15,8 +15,9 @@ _activated = _this select 2; if !(_activated) exitWith {}; -[_logic, QGVAR(mapIllumination), "MapIllumination"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(mapShake), "MapShake" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(mapLimitZoom), "MapLimitZoom" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(mapIllumination), "MapIllumination" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(mapShake), "MapShake" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(mapLimitZoom), "MapLimitZoom" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(mapShowCursorCoordinates), "MapShowCursorCoordinates"] call EFUNC(common,readSettingFromModule); diag_log text "[ACE]: Interaction Module Initialized."; From a47cdb9738290976b8e3e5b1e33b3d0ecfc15420 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 8 Apr 2015 10:45:57 +0200 Subject: [PATCH 25/26] disable map cursor coordinates in mp --- addons/map/XEH_postInitClient.sqf | 11 ----------- addons/map/XEH_preInit.sqf | 1 + addons/map/config.cpp | 10 +++++++++- addons/map/functions/fnc_onDrawMap.sqf | 5 +++++ 4 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 addons/map/functions/fnc_onDrawMap.sqf diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index c6a2c572ad..ccaf9041ab 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -19,15 +19,4 @@ call FUNC(determineZoom); ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}]; }; -// Note: doesn't work on postInit in SP, therefore use default setting -(findDisplay 12 displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); - -["mapDisplayLoaded", { - //hint str _this; systemChat str _this; diag_log str _this; - - if (_this select 1 == "ingame") then { - ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); - }; -}] call FUNC(addEventhandler); - ADDON = true; diff --git a/addons/map/XEH_preInit.sqf b/addons/map/XEH_preInit.sqf index 7899c6a637..c5645a52e7 100644 --- a/addons/map/XEH_preInit.sqf +++ b/addons/map/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(blueForceTrackingUpdate); PREP(determineMapLight); PREP(determineZoom); PREP(moduleMap); +PREP(onDrawMap); PREP(updateMapEffects); ADDON = true; diff --git a/addons/map/config.cpp b/addons/map/config.cpp index d9dae47bd3..cb3cbc8d6d 100644 --- a/addons/map/config.cpp +++ b/addons/map/config.cpp @@ -89,7 +89,8 @@ class RscMapControl { class RscDisplayMainMap { // Tweak map styling class controlsBackground { - class CA_Map : RscMapControl { + class CA_Map: RscMapControl { + onDraw = QUOTE([ctrlParent (_this select 0)] call DFUNC(onDrawMap)); #include "MapTweaks.hpp" }; }; @@ -147,6 +148,13 @@ class RscDisplayDiary { // BRIEFING SCREEN class RscDisplayGetReady: RscDisplayMainMap { + // Tweak map styling + class controlsBackground { + class CA_Map: RscMapControl { + onDraw = QUOTE([ctrlParent (_this select 0)] call DFUNC(onDrawMap)); + //#include "MapTweaks.hpp" @todo Shouldn't this apply to briefing too? + }; + }; // get rid of the "center to player position" - button (as it works even on elite) class controls { class TopRight: RscControlsGroup { diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf new file mode 100644 index 0000000000..2d17c24962 --- /dev/null +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -0,0 +1,5 @@ +// by commy2 +#include "script_component.hpp" + +diag_log text str diag_frameno; +((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); From deece11689490ce26001a7e771cc4853c7d4ecaf Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 8 Apr 2015 10:47:56 +0200 Subject: [PATCH 26/26] remove debug --- addons/map/functions/fnc_onDrawMap.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index 2d17c24962..bc147884e4 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -1,5 +1,4 @@ // by commy2 #include "script_component.hpp" -diag_log text str diag_frameno; ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates);