sreVprefixz\ace\addons\aiMikeroDePbo.dll.8.35version22092710$PBOPREFIX$.backup3cCfgEventHandlers.hppbCfgWeapons.hpp_SV`b_Sconfig.bin.3c.functions\fnc_drawCuratorGarrisonPathing.sqfV`bfunctions\fnc_drawCuratorGarrisonPathing.sqfc3cfunctions\fnc_garrison.sqf.V`b.functions\fnc_garrison.sqfc3cfunctions\fnc_garrisonMove.sqf<b<functions\fnc_garrisonMove.sqfc3cfunctions\fnc_initDisplayCurator.sqf:V`b:functions\fnc_initDisplayCurator.sqfc3cfunctions\fnc_unGarrison.sqf2V`b2functions\fnc_unGarrison.sqfc;3c;functions\script_component.hpp2V`b2README.md~b~script_component.hppV`bstringtable.xmlJV`bJTexheaders.bin 3c XEH_postInit.sqf4V`b4XEH_postInit.sqfc 3c XEH_preInit.sqfV`bXEH_preInit.sqfc3cXEH_PREP.hppwV`bwXEH_preStart.sqf<V`b<XEH_preStart.sqfcI3cIz\ace\addons\ai class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); }; }; class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); }; }; class Extended_PostInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); }; }; class Extended_DisplayLoad_EventHandlers { class RscDisplayCurator { ADDON = QUOTE(call FUNC(initDisplayCurator)); }; }; // weapon config changes, by commy2 /* documentation: aiRateOfFire = 5.0 Delay between shots at given aiRateOfFireDistance. aiRateOfFireDistance = 500 At shorter distance delay (aiRateOfFire) goes linearly to zero. */ class Mode_SemiAuto; class Mode_Burst; class Mode_FullAuto; class CfgWeapons { // rifles class Rifle_Base_F; class Rifle_Short_Base_F; class Rifle_Long_Base_F; // MX class arifle_MX_Base_F: Rifle_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; minRangeProbab = 0.7; // 0.5; midRange = 300; // 200; midRangeProbab = 0.5; // 0.7; }; class FullAuto; class fullauto_medium: FullAuto { minRange = 20; // 2; burst = "3 + round random 5"; //3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 500; minRange = 400; minRangeProbab = 0.1; midRange = 500; midRangeProbab = 0.2; maxRange = 600; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; class single_medium_optics1: Single { aiRateOfFireDistance = 700; // 600; minRange = 120; // 2; maxRange = 700; // 600; }; class single_far_optics2: single_medium_optics1 { aiRateOfFireDistance = 900; // 700; minRange = 200; // 100; maxRange = 900; // 700; }; }; // MX carbine class arifle_MXC_F: arifle_MX_Base_F { class Single: Single { minRange = 120; // 2; minRangeProbab = 0.5; // 0.3; midRange = 250; // 150; midRangeProbab = 0.3; // 0.5; }; class FullAuto; class fullauto_medium: fullauto_medium { minRange = 20; // 2; burst = "3 + round random 5"; //3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 400; minRange = 300; minRangeProbab = 0.1; midRange = 400; midRangeProbab = 0.2; maxRange = 500; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; class single_medium_optics1: single_medium_optics1 { aiRateOfFireDistance = 600; // 500; minRange = 120; // 2; maxRange = 600; // 500; }; class single_far_optics2: single_medium_optics1 { aiRateOfFireDistance = 800; // 700; minRange = 200; // 100; maxRange = 800; // 700; }; }; //class arifle_MX_F: arifle_MX_Base_F {}; //class arifle_MX_GL_F: arifle_MX_Base_F {}; // MX sniper rifle class arifle_MXM_F: arifle_MX_Base_F { class Single: Single { minRange = 120; // 2; minRangeProbab = 0.7; // 0.5; midRange = 350; // 250; midRangeProbab = 0.5; // 0.7; }; class fullauto_medium: fullauto_medium { minRange = 20; // 2; burst = "3 + round random 5"; //3; }; class single_medium_optics1: single_medium_optics1 { aiRateOfFireDistance = 700; // 600; minRange = 120; // 2; maxRange = 750; // 650; }; class single_far_optics2: single_far_optics2 { aiRateOfFireDistance = 900; // 800; minRange = 200; // 100; maxRange = 900; // 800; }; }; // MX machine gun class arifle_MX_SW_F: arifle_MX_Base_F { // Shit is still broken //modes[] += {"ACE_Burst_far"}; modes[] = {"Single","manual","close","short","medium","far_optic1","far_optic2","ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; }; class close; class medium; class ACE_Burst_far: medium { aiRateOfFire = 6.0; aiRateOfFireDistance = 900; minRange = 500; minRangeProbab = 0.1; midRange = 700; midRangeProbab = 0.2; maxRange = 900; maxRangeProbab = 0.2; burst = "3 + round random 5"; }; class far_optic1: close { aiRateOfFireDistance = 750; // 650; maxRange = 750; // 650; }; class far_optic2: far_optic1 { maxRange = 1100; // 900; aiRateOfFireDistance = 1100;// 900; }; }; // Katiba class arifle_Katiba_Base_F: Rifle_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; minRangeProbab = 0.7; // 0.5; midRange = 300; // 200; midRangeProbab = 0.5; // 0.7; }; class FullAuto; class fullauto_medium: FullAuto { minRange = 20; // 2; burst = "3 + round random 5"; //3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 500; minRange = 400; minRangeProbab = 0.1; midRange = 500; midRangeProbab = 0.2; maxRange = 600; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; class single_medium_optics1: Single { aiRateOfFireDistance = 700; // 600; minRange = 120; // 2; maxRange = 700; // 600; }; class single_far_optics2: single_medium_optics1 { aiRateOfFireDistance = 900; // 800; minRange = 200; // 100; maxRange = 900; // 800; }; }; // Katiba carbine class arifle_Katiba_C_F: arifle_Katiba_Base_F { class Single: Single { minRange = 120; // 2; minRangeProbab = 0.5; // 0.3; midRange = 250; // 150; midRangeProbab = 0.3; // 0.7; }; //class FullAuto: FullAuto {}; class fullauto_medium: fullauto_medium { minRange = 20; // 2; maxRange = 150; //100; burst = "3 + round random 5"; //3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 400; minRange = 300; minRangeProbab = 0.1; midRange = 400; midRangeProbab = 0.2; maxRange = 500; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; class single_medium_optics1: single_medium_optics1 { minRange = 120; // 2; maxRange = 600; // 500; }; class single_medium_optics2: single_medium_optics1 { aiRateOfFireDistance = 800; // 700; minRange = 200; // 100; maxRange = 800; // 700; }; }; // F2002 class mk20_base_F: Rifle_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; minRangeProbab = 0.7; // 0.5; midRange = 250; // 150; midRangeProbab = 0.5; // 0.7; }; class FullAuto: Mode_FullAuto { minRange = 0; //2; }; class fullauto_medium: FullAuto { minRange = 20; // 2; maxRange = 150; // 100; burst = "3 + round random 5"; // 3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 500; minRange = 400; minRangeProbab = 0.1; midRange = 500; midRangeProbab = 0.2; maxRange = 600; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; class single_medium_optics1: Single { aiRateOfFireDistance = 600; // 500; minRange = 120; // 5; maxRange = 600; // 500; }; class single_far_optics2: single_medium_optics1 { aiRateOfFireDistance = 800; // 700; minRange = 200; // 100; maxRange = 800; // 700; }; }; // F2002 carbine class arifle_Mk20C_F: mk20_base_F { class Single: Single { minRange = 120; // 2; minRangeProbab = 0.7; // 0.5; midRange = 250; // 150; midRangeProbab = 0.5; // 0.7; maxRange = 350; // 250; }; class FullAuto: FullAuto { minRange = 0; //2; }; class single_medium_optics1: single_medium_optics1 { aiRateOfFireDistance = 600; // 500; minRange = 120; // 5; maxRange = 550; // 450; }; //class single_medium_optics2: single_medium_optics1 {}; class fullauto_medium: fullauto_medium { minRange = 20; //2; burst = "3 + round random 5"; //3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 400; minRange = 300; minRangeProbab = 0.1; midRange = 400; midRangeProbab = 0.2; maxRange = 500; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; }; // TAR-20 class Tavor_base_F: Rifle_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; //2; minRangeProbab = 0.7; //0.5; midRange = 250; //150; midRangeProbab = 0.5; //0.7; maxRange = 350; //250; }; class FullAuto: Mode_FullAuto { minRange = 0; //2; }; class fullauto_medium: FullAuto { minRange = 20; // 2; maxRange = 150; // 100; burst = "3 + round random 5"; // 3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 400; minRange = 300; minRangeProbab = 0.1; midRange = 400; midRangeProbab = 0.2; maxRange = 500; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; class single_medium_optics1: Single { aiRateOfFireDistance = 600; // 500; minRange = 120; // 5; maxRange = 550; // 450; }; class single_medium_optics2: single_medium_optics1 { aiRateOfFireDistance = 700; // 600; minRange = 200; // 100; maxRange = 700; // 600; }; }; // TAR-21 class arifle_TRG21_F: Tavor_base_F { class Single: Single { minRange = 120; // 2; minRangeProbab = 0.7; // 0.3; midRange = 300; // 200; midRangeProbab = 0.5; // 0.7; maxRange = 400; // 300; }; class FullAuto: FullAuto { minRange = 0; //2; }; class fullauto_medium: fullauto_medium { minRange = 20; // 2; maxRange = 150; // 100; burst = "3 + round random 5"; // 3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 400; minRange = 300; minRangeProbab = 0.1; midRange = 400; midRangeProbab = 0.2; maxRange = 500; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; class single_medium_optics1: single_medium_optics1 { aiRateOfFireDistance = 700; // 600; minRange = 120; // 2; maxRange = 600; // 500; }; class single_medium_optics2: single_medium_optics1 { aiRateOfFireDistance = 800; // 700; minRange = 200; // 100; maxRange = 800; // 700; }; }; // sub machine guns // SDAR class SDAR_base_F: Rifle_Base_F { class Single: Mode_SemiAuto { minRange = 10; //2; }; class Burst: Mode_Burst { minRange = 5; //1; }; }; // PD2000 class pdw2000_base_F: Rifle_Short_Base_F { class Single: Mode_SemiAuto { minRange = 100; //2; }; class Burst: Mode_Burst { minRange = 50; //1; }; }; // Vector class SMG_01_Base: Rifle_Short_Base_F { class Single: Mode_SemiAuto { minRange = 50; //2; }; class Burst: Mode_Burst { minRange = 25; //2; }; }; // Scorpion EVO class SMG_02_base_F: Rifle_Short_Base_F { class Single: Mode_SemiAuto { minRange = 50; //2; }; class Burst: Mode_Burst { minRange = 25; //2; }; }; // machine guns // Stoner class LMG_Mk200_F: Rifle_Long_Base_F { modes[] += {"ACE_Burst_far"}; class medium; class ACE_Burst_far: medium { aiRateOfFire = 6.0; aiRateOfFireDistance = 900; minRange = 500; minRangeProbab = 0.1; midRange = 700; midRangeProbab = 0.2; maxRange = 900; maxRangeProbab = 0.2; burst = "3 + round random 5"; }; class far_optic1: medium { maxRange = 750; // 650; }; class far_optic2: far_optic1 { maxRange = 1100; // 900; aiRateOfFireDistance = 1100;// 900; }; }; // Negev class LMG_Zafir_F: Rifle_Long_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; }; class close; class medium; class ACE_Burst_far: medium { aiRateOfFire = 6.0; aiRateOfFireDistance = 900; minRange = 500; minRangeProbab = 0.1; midRange = 700; midRangeProbab = 0.2; maxRange = 900; maxRangeProbab = 0.2; burst = "3 + round random 5"; }; class far_optic1: close { maxRange = 800; //700; }; class far_optic2: far_optic1 { maxRange = 1200; //1000; }; }; // marksmen marksmen class DMR_03_base_F: Rifle_Long_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; minRangeProbab = 0.7; // 0.3; midRangeProbab = 0.3; // 0.7; }; class FullAuto; class single_close_optics1: Single { minRange = 120; // 2; minRangeProbab = 0.8; // 0.05; midRangeProbab = 0.05; // 0.8; }; class single_medium_optics1: single_close_optics1 { minRangeProbab = 0.7; // 0.05; midRangeProbab = 0.05; // 0.7; }; class single_far_optics1: single_medium_optics1 { minRange = 400; // 300; minRangeProbab = 0.5; // 0.05; midRangeProbab = 0.05; // 0.5; }; class fullauto_medium: FullAuto { minRange = 20; // 2; maxRange = 150; // 100; burst = "3 + round random 5"; // 3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 500; minRange = 400; minRangeProbab = 0.1; midRange = 500; midRangeProbab = 0.2; maxRange = 600; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; }; class DMR_05_base_F: Rifle_Long_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; minRangeProbab = 0.7; // 0.3; midRangeProbab = 0.3; // 0.7; }; class FullAuto; class single_close_optics1: Single { minRange = 120; // 2; minRangeProbab = 0.8; // 0.05; midRangeProbab = 0.05; // 0.8; }; class single_medium_optics1: single_close_optics1 { minRangeProbab = 0.7; // 0.05; midRangeProbab = 0.05; // 0.7; }; class single_far_optics1: single_medium_optics1 { minRange = 400; // 300; minRangeProbab = 0.5; // 0.05; midRangeProbab = 0.05; // 0.5; }; class fullauto_medium: FullAuto { minRange = 20; // 2; maxRange = 150; // 100; burst = "3 + round random 5"; // 3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 500; minRange = 400; minRangeProbab = 0.1; midRange = 500; midRangeProbab = 0.2; maxRange = 600; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; }; class DMR_06_base_F: Rifle_Long_Base_F { modes[] += {"ACE_Burst_far"}; class Single: Mode_SemiAuto { minRange = 120; // 2; minRangeProbab = 0.7; // 0.3; midRangeProbab = 0.3; // 0.7; }; class FullAuto; class single_close_optics1: Single { minRange = 120; // 2; minRangeProbab = 0.8; // 0.05; midRangeProbab = 0.05; // 0.8; }; class single_medium_optics1: single_close_optics1 { minRangeProbab = 0.7; // 0.05; midRangeProbab = 0.05; // 0.7; }; class single_far_optics1: single_medium_optics1 { minRange = 400; // 300; minRangeProbab = 0.5; // 0.05; midRangeProbab = 0.05; // 0.5; }; class fullauto_medium: FullAuto { minRange = 20; // 2; maxRange = 150; // 100; burst = "3 + round random 5"; // 3; }; class ACE_Burst_far: fullauto_medium { aiRateOfFire = 2.0; aiRateOfFireDistance = 500; minRange = 400; minRangeProbab = 0.1; midRange = 500; midRangeProbab = 0.2; maxRange = 600; maxRangeProbab = 0.2; burst = "2 + round random 3"; }; }; // marksmen medium mg class MMG_01_base_F: Rifle_Long_Base_F { modes[] += {"ACE_Burst_far"}; class manual; class burst; class close; class short; class medium; class ACE_Burst_far: medium { aiRateOfFire = 6.0; aiRateOfFireDistance = 900; minRange = 700; minRangeProbab = 0.1; midRange = 900; midRangeProbab = 0.2; maxRange = 1100; maxRangeProbab = 0.2; burst = "3 + round random 5"; }; class far_optic1; class far_optic2; }; class MMG_02_base_F: Rifle_Long_Base_F { modes[] += {"ACE_Burst_far"}; class manual; class close; class short; class medium; class ACE_Burst_far: medium { aiRateOfFire = 6.0; aiRateOfFireDistance = 900; minRange = 700; minRangeProbab = 0.1; midRange = 900; midRangeProbab = 0.2; maxRange = 1100; maxRangeProbab = 0.2; burst = "3 + round random 5"; }; class far_optic1; class far_optic2; }; }; raP- CfgPatchesMode_SemiAutoMode_BurstMode_FullAutoCfgWeaponsExtended_PreStart_EventHandlers,Extended_PreInit_EventHandlers,Extended_PostInit_EventHandlersU-Extended_DisplayLoad_EventHandlers--ace_ai nameACE3 - AIunitsweaponsrequiredVersionff@requiredAddonsace_commonauthor$STR_ace_common_ACETeamauthorsKoffeinFlummicommy2url$STR_ace_main_URLversionI@versionStr3.15.2.69versionArERifle_Base_FRifle_Short_Base_FRifle_Long_Base_Farifle_MX_Base_Farifle_MXC_Ffarifle_MXM_Farifle_MX_SW_F arifle_Katiba_Base_F arifle_Katiba_C_F3mk20_base_Farifle_Mk20C_FyTavor_base_Farifle_TRG21_FSDAR_base_Fipdw2000_base_FSMG_01_BaseCSMG_02_base_FLMG_Mk200_F#LMG_Zafir_FDMR_03_base_FB!DMR_05_base_F9$DMR_06_base_F0'MMG_01_base_F'*MMG_02_base_Fj+,Rifle_Base_FmodesACE_Burst_farSinglepFullAutofullauto_mediumACE_Burst_farsingle_medium_optics1single_far_optics2fMode_SemiAutominRangexminRangeProbab333?midRange,midRangeProbab?FullAutominRangeburst3 + round random 5fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeXmaxRangeProbabL>burst2 + round random 3SingleaiRateOfFireDistanceminRangexmaxRangesingle_medium_optics1aiRateOfFireDistanceminRangemaxRangefarifle_MX_Base_FSingleFullAutofullauto_mediumAACE_Burst_farsingle_medium_optics1Jsingle_far_optics2SingleminRangexminRangeProbab?midRangemidRangeProbab>Afullauto_mediumminRangeburst3 + round random 5fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRange,minRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst2 + round random 3Jsingle_medium_optics1aiRateOfFireDistanceXminRangexmaxRangeXsingle_medium_optics1aiRateOfFireDistance minRangemaxRange arifle_MX_Base_FSingle\ fullauto_medium single_medium_optics1 single_far_optics2C SingleminRangexminRangeProbab333?midRange^midRangeProbab? fullauto_mediumminRangeburst3 + round random 5 single_medium_optics1aiRateOfFireDistanceminRangexmaxRangeC single_far_optics2aiRateOfFireDistanceminRangemaxRange arifle_MX_Base_FmodesSinglemanualcloseshortmediumfar_optic1far_optic2ACE_Burst_farSingleM closemediumACE_Burst_faro far_optic10 far_optic2e Mode_SemiAutominRangexo medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst3 + round random 50 closeaiRateOfFireDistancemaxRangee far_optic1maxRangeLaiRateOfFireDistanceL Rifle_Base_FmodesACE_Burst_farSingle= FullAutofullauto_medium ACE_Burst_far single_medium_optics1single_far_optics23Mode_SemiAutominRangexminRangeProbab333?midRange,midRangeProbab? FullAutominRangeburst3 + round random 5 fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeXmaxRangeProbabL>burst2 + round random 3SingleaiRateOfFireDistanceminRangexmaxRangesingle_medium_optics1aiRateOfFireDistanceminRangemaxRange3arifle_Katiba_Base_FSinglefullauto_medium ACE_Burst_farYsingle_medium_optics1#single_medium_optics2\SingleminRangexminRangeProbab?midRangemidRangeProbab> fullauto_mediumminRangemaxRangeburst3 + round random 5Yfullauto_medium aiRateOfFire@aiRateOfFireDistanceminRange,minRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst2 + round random 3#single_medium_optics1minRangexmaxRangeX\single_medium_optics1aiRateOfFireDistance minRangemaxRange Rifle_Base_FmodesACE_Burst_farSingleRFullAutofullauto_mediumACE_Burst_farsingle_medium_optics1single_far_optics2%yMode_SemiAutominRangexminRangeProbab333?midRangemidRangeProbab?Mode_FullAutominRangeFullAutominRangemaxRangeburst3 + round random 5fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeXmaxRangeProbabL>burst2 + round random 3SingleaiRateOfFireDistanceXminRangexmaxRangeX%single_medium_optics1aiRateOfFireDistance minRangemaxRange ymk20_base_FSingleFullAutoJsingle_medium_optics1gfullauto_mediumACE_Burst_farSingleminRangexminRangeProbab333?midRangemidRangeProbab?maxRange^JFullAutominRangegsingle_medium_optics1aiRateOfFireDistanceXminRangexmaxRange&fullauto_mediumminRangeburst3 + round random 5fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRange,minRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst2 + round random 3Rifle_Base_FmodesACE_Burst_farSingleiFullAutofullauto_mediumACE_Burst_far<single_medium_optics1single_medium_optics2KMode_SemiAutominRangexminRangeProbab333?midRangemidRangeProbab?maxRange^Mode_FullAutominRangeFullAutominRangemaxRangeburst3 + round random 5<fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRange,minRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst2 + round random 3SingleaiRateOfFireDistanceXminRangexmaxRange&Ksingle_medium_optics1aiRateOfFireDistanceminRangemaxRangeTavor_base_FSingle)FullAutofullauto_mediumACE_Burst_farsingle_medium_optics1single_medium_optics2iSingleminRangexminRangeProbab333?midRange,midRangeProbab?maxRangeFullAutominRangefullauto_mediumminRangemaxRangeburst3 + round random 5fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRange,minRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst2 + round random 3single_medium_optics1aiRateOfFireDistanceminRangexmaxRangeXsingle_medium_optics1aiRateOfFireDistance minRangemaxRange iRifle_Base_FSingleBurstMode_SemiAutominRange Mode_BurstminRangeRifle_Short_Base_FSingleBurst$CMode_SemiAutominRanged$Mode_BurstminRange2CRifle_Short_Base_FSinglerBurstMode_SemiAutominRange2Mode_BurstminRangeRifle_Short_Base_FSingleBurst#Mode_SemiAutominRange2Mode_BurstminRange#Rifle_Long_Base_FmodesACE_Burst_farmediumACE_Burst_farfar_optic1Qfar_optic2lmedium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst3 + round random 5QmediummaxRangelfar_optic1maxRangeLaiRateOfFireDistanceLRifle_Long_Base_FmodesACE_Burst_farSingle& closemediumACE_Burst_farH far_optic1 !far_optic2#!B!Mode_SemiAutominRangexH medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangemaxRangeProbabL>burst3 + round random 5 !closemaxRange #!far_optic1maxRangeB!Rifle_Long_Base_FmodesACE_Burst_farSingle!FullAutosingle_close_optics1K"single_medium_optics1"single_far_optics1"fullauto_medium(#ACE_Burst_faro#9$Mode_SemiAutominRangexminRangeProbab333?midRangeProbab>K"SingleminRangexminRangeProbabL?midRangeProbabL="single_close_optics1minRangeProbab333?midRangeProbabL="single_medium_optics1minRangeminRangeProbab?midRangeProbabL=(#FullAutominRangemaxRangeburst3 + round random 5o#fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeXmaxRangeProbabL>burst2 + round random 39$Rifle_Long_Base_FmodesACE_Burst_farSingle$FullAutosingle_close_optics1B%single_medium_optics1%single_far_optics1%fullauto_medium&ACE_Burst_farf&0'Mode_SemiAutominRangexminRangeProbab333?midRangeProbab>B%SingleminRangexminRangeProbabL?midRangeProbabL=%single_close_optics1minRangeProbab333?midRangeProbabL=%single_medium_optics1minRangeminRangeProbab?midRangeProbabL=&FullAutominRangemaxRangeburst3 + round random 5f&fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeXmaxRangeProbabL>burst2 + round random 30'Rifle_Long_Base_FmodesACE_Burst_farSingle'FullAutosingle_close_optics19(single_medium_optics1~(single_far_optics1(fullauto_medium)ACE_Burst_far])'*Mode_SemiAutominRangexminRangeProbab333?midRangeProbab>9(SingleminRangexminRangeProbabL?midRangeProbabL=~(single_close_optics1minRangeProbab333?midRangeProbabL=(single_medium_optics1minRangeminRangeProbab?midRangeProbabL=)FullAutominRangemaxRangeburst3 + round random 5])fullauto_medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeXmaxRangeProbabL>burst2 + round random 3'*Rifle_Long_Base_F modesACE_Burst_farmanualburstcloseshortmediumACE_Burst_far*far_optic1far_optic2j+medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeLmaxRangeProbabL>burst3 + round random 5j+Rifle_Long_Base_FmodesACE_Burst_farmanualcloseshortmediumACE_Burst_far+far_optic1far_optic2,medium aiRateOfFire@aiRateOfFireDistanceminRangeminRangeProbab=midRangemidRangeProbabL>maxRangeLmaxRangeProbabL>burst3 + round random 5,ace_ai,,initcall compileScript ['\z\ace\addons\ai\XEH_preStart.sqf'],ace_ai-U-initcall compileScript ['\z\ace\addons\ai\XEH_preInit.sqf']U-ace_aig--initcall compileScript ['\z\ace\addons\ai\XEH_postInit.sqf']-RscDisplayCurator--ace_aicall ace_ai_fnc_initDisplayCurator-#include "script_component.hpp" /* * Author: alganthe * Draws AI garrison pathing while the Zeus display is open. * * Arguments: * None * * Return Value: * None * * Example: * [] call ace_ai_fnc_drawCuratorGarrisonPathing * * Public: No */ if (isNull findDisplay 312) exitWith { removeMissionEventHandler ["Draw3D", _thisEventHandler]; }; private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []]; { _x params ["_unit", "_pos"]; switch (true) do { case (surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : { for "_i" from 0 to 3 do { drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLtoASL _pos), [1,0,0,1]]; }; drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75]; }; case (!surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : { for "_i" from 0 to 3 do { drawLine3D [_unit modelToWorldVisual [0,0,1], _pos, [1,0,0,1]]; }; drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75]; }; case (!surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : { for "_i" from 0 to 3 do { drawLine3D [_unit modelToWorldVisual [0,0,1], (AGLToASL _pos), [1,0,0,1]]; }; drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75]; }; case (surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : { for "_i" from 0 to 3 do { drawLine3D [_unit modelToWorldVisualWorld [0,0,1], _pos, [1,0,0,1]]; }; drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75]; }; }; } forEach _unitMoveList; S!&&B: _posXthiseventhandlerLunit mol tO_xagltoaslIc e[do Prawicon3dline3dBexw h fdd playWoreachX fromgetHT@variablv ifLisnullmissionnamespaceJod*towldvual2PI pamsreh *% surfT iswaterUsFchZto-CDraw3D| >@@  ace_ai_garrison_unitMoveListX _posof U|EN_iQv@@P?YmEr  '  h(QE֥ ) \a3\ui_f\data\map\groupicons\waypoint.paag?M 8'q HB   Q ,ze Fd%MLA ED&H/E&}#ydDA&Y*]LcCq,%+u\U+I e+kM*B7 TEA $ i$$$E$"1e'e$֤\']]"]",) ;V*p|EkEh' },+5U!U!- ]"'|]"EE *Ri+"["b]"g1^E.}"0] '*a.e$E$X(q1yDGdDAEc'}3+L-HM%]r +E$IפE$E*i2$$E$°1q} 5e$|*C]"8]"UYtO6&{td' ^Y F۠pIԤI'ysQ Q  q !WQ Q Z Q  (Q Q  Bq {  6m nmod;t36*versD <7)6 \ @)3 ) aos ))xx/cba8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d/"70! Y|5| |(debug t()8?l 5 t7 ) 190 3.if (isNull findDisplay 312) exitWith {$rem!YOM".E ntHandler ["$P", _M s*p ]; }; private +xP = m NameSp@ getVariable\ :pQV []Y _x r s ["A""Q"pjswc3(true) doccas(sNfKIsWMr QP ) && {-y }:)$af_Ji"r q]\t 3,}5LJ;3D- !3 elToWorldVisual [0,0,1], (AGLtoASL)U 1Dl\*l\..I!Ri " `St, 10.75*)x>,y! |. D(lx L@ / ]qDT v| ~ }mEHh,; "`]"P!Pa"iZV"hrViD"\P"XMƤ!Lk"V8V=/z/ace/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf#include "script_component.hpp" /* * Author: alganthe * Garrison function used to garrison AI inside buildings. * * Arguments: * 0: The building(s) nearest this position are used * 1: Limit the building search to those type of building * 2: Units that will be garrisoned * 3: Radius to fill building(s) (default: 50) * 4: 0: even filling, 1: building by building, 2: random filling (default: 0) * 5: True to fill building(s) from top to bottom (default: false) (note: only works with filling mode 0 and 1) * 6: Teleport units (default: false) * Return Value: * Units not garrisoned * * Example: * [position, nil, [unit1, unit2, unit3, unitN], 200, 1, false, false] call ace_ai_fnc_garrison * * Public: Yes */ params [["_startingPos",[0,0,0], [[]], 3], ["_buildingTypes", ["Building"], [[]]], ["_unitsArray", [], [[]]], ["_fillingRadius", 50, [0]], ["_fillingType", 0, [0]], ["_topDownFilling", false, [true]], ["_teleport", false, [true]]]; TRACE_6("fnc_garrison: Start",_startingPos,_buldingTypes,count _unitsArray,_fillingRadius,_fillingTYpe,_topDownFilling); _unitsArray = _unitsArray select {alive _x && {!isPlayer _x}}; private _currentUnitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []]; if (_startingPos isEqualTo [0,0,0]) exitWith { TRACE_1("fnc_garrison: StartingPos error",_startingPos); [LSTRING(GarrisonInvalidPosition)] call EFUNC(common,displayTextStructured); }; if (count _unitsArray == 0 || {isNull (_unitsArray select 0)}) exitWith { TRACE_1("fnc_garrison: Units error",_unitsArray); [LSTRING(GarrisonNoUnits)] call EFUNC(common,displayTextStructured); }; private _buildings = nearestObjects [_startingPos, _buildingTypes, ([_fillingRadius, 50] select (_fillingRadius < 50))]; if (_fillingRadius >= 50) then { _buildings = [_buildings] call CBA_fnc_shuffle; }; if (count _buildings == 0) exitWith { TRACE_1("fnc_garrison: Building error",_buildings); [LSTRING(GarrisonNoBuilding)] call EFUNC(common,displayTextStructured); }; private _buildingsIndex = []; if (_topDownFilling) then { { private _buildingPos = _x buildingPos -1; // Those reverse are necessary, as dumb as it is there's no better way to sort those subarrays in sqf { reverse _x; } foreach _buildingPos; _buildingPos sort false; { reverse _x; } foreach _buildingPos; _buildingsIndex pushBack _buildingPos; } foreach _buildings; } else { { _buildingsIndex pushBack (_x buildingPos -1); } foreach _buildings; }; // Remove buildings without positions { _buildingsIndex deleteAt (_buildingsIndex find _x); } foreach (_buildingsIndex select {count _x == 0}); //Remove positions units are already pathing to _buildingsIndex = _buildingsIndex apply { _x select { private _testedPos = _x; ({(_x select 1) isEqualTo _testedPos} count (missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []])) == 0 } }; // Warn the user that there's not enough positions to place all units private _count = 0; {_count = _count + count _x} foreach _buildingsIndex; if ( (count _unitsArray) - _count > 0) then { TRACE_4("fnc_garrison: Not enough spots to place all units",_unitsArray,count _unitsArray,_count,((count _unitsArray) - _count > 0)); [LSTRING(GarrisonNotEnoughPos)] call EFUNC(common,displayTextStructured); }; private _placedUnits = []; private _unitMoveList = []; // Force all units to un-garrison [QGVAR(unGarrison), [_unitsArray], _unitsArray] call CBA_fnc_targetEvent; private _fnc_comparePos = { params ["_nearestUnits", "_pos"]; ({ if (surfaceIsWater getPos _x) then { floor ((getPosASL _x) select 2) == floor ((AGLtoASL _pos) select 2) } else { floor ((getPosATL _x) select 2) == floor (_pos select 2) }; } count _nearestUnits) > 0 }; // Do the placement switch (_fillingType) do { // Even filling case 0: { while {count _unitsArray > 0} do { if (count _buildingsIndex == 0) exitWith {}; private _building = _buildingsIndex select 0; if (_building isEqualTo []) then { LOG(format [ARR_2("fnc_garrison: Empty building array | removing building from buildingsIndex | %1 buildings remaining",count _buildingsIndex)]); _buildingsIndex deleteAt 0; } else { private _pos = _building select 0; private _nearestUnits = (_pos nearEntities ["CAManBase", 2]); LOG(format [ARR_3("fnc_garrison: Unit detection | %1 units nearby | %2 units within height",count _nearestUnits, {floor ((getPos _x) select 2) == floor (_pos select 2)} count _nearestUnits)]); if (count _nearestUnits > 0 && {[_nearestUnits, _pos] call _fnc_comparePos}) then { LOG(format [ARR_2("fnc_garrison: Unit present | removing position | %1 positions remaining for this building",count (_buildingsIndex select (_buildingsIndex find _building)) - 1)]); _buildingsIndex set [0, _building - [_pos]]; } else { private _unit = _unitsArray select 0; private _posSurface = surfaceIsWater _pos; if (_teleport) then { doStop _unit; if (_posSurface) then { _unit setPosASL (AGLtoASL _pos); } else { _unit setPosATL _pos; }; _currentUnitMoveList deleteAt (_currentUnitMoveList findIf {_x select 0 == _unit}); } else { _unitMoveList pushBack [_unit,[_pos, AGLToASL _pos] select (_posSurface)]; }; _placedUnits pushBack _unit; _unitsArray deleteAt (_unitsArray find _unit); _building deleteAt 0; _buildingsIndex deleteAt 0; _buildingsIndex pushBackUnique _building; _unit setVariable [QGVAR(garrisonned), true, true]; }; }; }; }; // Building by building case 1: { while {count _unitsArray > 0} do { if (count _buildingsIndex == 0) exitWith {}; private _building = _buildingsIndex select 0; if (_building isEqualTo []) then { LOG(format [ARR_2("fnc_garrison: empty building array | removing building from buildingsIndex | %1 buildings remaining",count _buildingsIndex)]); _buildingsIndex deleteAt 0; } else { private _pos = _building select 0; private _nearestUnits = (_pos nearEntities ["CAManBase", 2]); LOG(format [ARR_3("fnc_garrison: Unit detection | %1 units nearby | %2 units within height",count _nearestUnits, {floor ((getPos _x) select 2) == floor (_pos select 2)} count _nearestUnits)]); if (count _nearestUnits > 0 && {[_nearestUnits, _pos] call _fnc_comparePos}) then { LOG(format [ARR_2("fnc_garrison: Unit present | removing position | %1 positions remaining for this building",count (_buildingsIndex select (_buildingsIndex find _building)) - 1)]); _buildingsIndex set [0, _building - [_pos]]; } else { private _unit = _unitsArray select 0; private _posSurface = surfaceIsWater _pos; if (_teleport) then { doStop _unit; if (_posSurface) then { _unit setPosASL (AGLtoASL _pos); } else { _unit setPosATL _pos; }; _currentUnitMoveList deleteAt (_currentUnitMoveList findIf {_x select 0 == _unit}); } else { _unitMoveList pushBack [_unit,[_pos, AGLToASL _pos] select (_posSurface)]; }; _placedUnits pushBack _unit; _unitsArray deleteAt (_unitsArray find _unit); _buildingsIndex set [0, _building - [_pos]]; _unit setVariable [QGVAR(garrisonned), true, true]; }; }; }; }; // Random case 2: { while {count _unitsArray > 0} do { if (count _buildingsIndex == 0) exitWith {}; private _building = selectRandom _buildingsIndex; if (_building isEqualTo []) then { LOG(format [ARR_2("fnc_garrison: empty building array | removing building from buildingsIndex | %1 buildings remaining",count _buildingsIndex)]); _buildingsIndex deleteAt (_buildingsIndex find _building); } else { private _pos = selectRandom _building; private _nearestUnits = (_pos nearEntities ["CAManBase", 2]); LOG(format [ARR_3("fnc_garrison: Unit detection | %1 units nearby | %2 units within height",count _nearestUnits, {floor ((getPos _x) select 2) == floor (_pos select 2)} count _nearestUnits)]); if (count _nearestUnits > 0 && {[_nearestUnits, _pos] call _fnc_comparePos}) then { LOG(format [ARR_2("fnc_garrison: Unit present | removing position | %1 positions remaining for this building",count (_buildingsIndex select (_buildingsIndex find _building)) - 1)]); _buildingsIndex set [(_buildingsIndex find _building), _building - [_pos]]; } else { private _unit = _unitsArray select 0; private _posSurface = surfaceIsWater _pos; if (_teleport) then { doStop _unit; if (_posSurface) then { _unit setPosASL (AGLtoASL _pos); } else { _unit setPosATL _pos; }; _currentUnitMoveList deleteAt (_currentUnitMoveList findIf {_x select 0 == _unit}); } else { _unitMoveList pushBack [_unit,[_pos, AGLToASL _pos] select (_posSurface)]; }; _placedUnits pushBack _unit; _unitsArray deleteAt (_unitsArray find _unit); _buildingsIndex set [(_buildingsIndex find _building), _building - [_pos]]; _unit setVariable [QGVAR(garrisonned), true, true]; }; }; }; }; }; TRACE_1(format [ARR_2("fnc_garrison: while loop ended | %1 units ready to be treated by PFH",count _unitMoveList)], _teleport); // Update the unit list and remove duplicate positions and units private _garrison_unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []]; _garrison_unitMoveList = _garrison_unitMoveList select { _x params ["_testedUnit", "_testedPos"]; ({(_x select 0) isEqualTo _testedUnit} count _unitMoveList == 0) }; _garrison_unitMoveList append _unitMoveList; missionNameSpace setVariable [QGVAR(garrison_unitMoveList), _garrison_unitMoveList, true]; if (_teleport) then { [QGVAR(AISection), [_placedUnits, ["PATH"], false], _placedUnits] call CBA_fnc_targetEvent; } else { [_unitMoveList] call FUNC(garrisonMove); }; TRACE_1(format [ARR_3("fnc_garrison: End | %1 units left | %2 buildings left", count _unitsArray, count _buildingsIndex)], _unitsArray); _unitsArray P!&&A+M-M:MC>= _building ),pos ):s*0index)Dtypes@count`urrentunitmovelistaf l^ra us| `k fncOmpaEEg ron_*) BneQs placed{os s "fHnst tatZ rtetN edl ptopdownDdl*L|BayS+_xC_aia$ImHudEy xtructuredZglaslYa veV,apKndap y\)Ic lsk*cba shuffle(DN!ge vX4L 7] dM"t VtBdoQ d \Bex 6w hI f@@HzifOfloQ]o,achH@ ,\(.tlHMviabF ifYi+qu .ttisnullT"er msiKnamgp:@nttiXKBobject|Q_HamsYph =ckPO5queUrI r YsNct\ ra7omyt\T'(LM#s\IT Nisw erl M'cr'th,N&wh lj||tKLR _startingPosQL)p@@\build\Types B( DunitsArray-q flVRausBHBhd()LtopDownF `eleport'jSDY ]T T<dDAFEML'|E$  OL ace_ai_garrison!MoveList"STR GInvalidY3iionQ ]u !V +@E"&(tE'|$  D-pE;L1NoUn7]U' a&mͤMȥ(d2HB5MW+ I* (P3DMIX'Q m0f Q?Y!DwAq;y7ݥC Q*JVAmBCU m7DFY' TuQ0J] `uB}X}wiDVVYAE;Dc~}HmE'ߥAƅSA4\c}EV3MEWg IqQE9'1"}Ne<'%Q  L12-yE '5 }Ol2|E,ZM DTj }UD   :E@L A}TB֤VdG=Z9-8`U] 'u Sa DXlr[ 0Y, Ќ4 tEnoughFQZ'  0u^nhMh(xQun EC&_ne est[_pq@I@YeYL HY_qgkqU6bcMM3  x#'pmE&ENT @U }mu 7İIU إ'ΤM E' 6}jm /5 K9I\:MM++HlDU( q-hKU! boeI p]UDDc[}xY|DgYdX L CAManBase-DM.V^=dE HC(YUV'5VVdE8# GXUK'1 GmuW MHDHTv`gUаE{ܥ ٥vMT-geZ/QjID6EưF6 I@ű2Y]x' Wy3M:I@#DI.W!p!D2)Ap.!ned!#`U5jXMm7LR' A>!A#UMFE+ }%!y&RVFqe7K )ZSej aE0) pe0y^^E=ViF'%AYϤ^4^Xq}0i$@}`i} @BYiU  !#+P)YIR L' 6V~FAgE%!}I,Niq%~ּY6ɥ> Vi}%&LL  X2AZY2pQ7ڀdLeyB  }U$ 0Aiz ڰQJWi|J i|N: ] -@UDYT# NN. l.,)A2V`|D>B *T\YThdDMxY!)(Vq٤AeФYŤXH)Vu-Y#YD(v٦YMdLL(leyeyiy\/Iqvg YU雰M|U]D(}y ?dMYYI.-Y%Y &+7U2i'ybm4٣zYA;YYvM rYE !P6h}٣ٰY[Ťym&e Yy;qy7E-4Le-hay~E:uyiq'%AYyi!L!DwdL!!9dM!M!M!N!a+e/E#Tl(e !:+݂M>E4'e^}ţhU+Wei(eUEehfzD@%@ipEE25 1E2GA6'e^qeX nETtei QeieE֤EȤ] 6 UEi'e0 %D!!;CET3(em5d|DF&*eVePFdDYtŤEfPf(eih}MdEED(e}uEFg)*dvţjEvYcs\(e0u e)eSieO]/;!,8}u+ EJ<_E@U]D(e}eͤMԤEڤEӤI.EEäU2''U^P'%3!$.1 ?LM>KAIAYAmEPDHE}ѦE_qiqѤQäqiqQ0=  q00,e qBQ=9q]iis'%AMiqiq#'%ˤY$ƤY$Y$Y$Y$Y$|!L+=]m%"l<]Vq'%YEEEuHP|euM!OeE\mᝬAq(SUF]0}]:!"]Q8> װQ8QD"Ei}פ ]Ӥ}-ua EqOiqcQYQKQ ?!=IY '9 Q@ °Q0UU:A",Uz;Cv/ A\"Oih!IhMa iA!-$5^t!Fed"F!DR"-HC GHCDV !Bm&GE[ Q!LEs'aG} aCQA?"iCE n\3|"$T&(;AISec"\@PATHY'MRdGDwCH P!^A!X','Mu+! 7YE3'}R!L! !L#!ae 0 "/z/\ /addons/ai/funsnc'|>.sqf" 1T9sc pt_component.hpp` t.>  6m nmod;t36*versD <7)6 \ @)3 ) aos ))xx/cba8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d/"70! Y|5| |(debug t()8?l 5 t7 ) 190:34p ams [["*h",[0,F],E]U3e","h&]"(p+h+̙U5  ,px H*d,PfalseHtrue%/v];:H)[ = *5sDct {alive _x && {!isPlayerB}} pSva  cu T1"0?&H] m"3N SeSUc getVariableT:@$pif (* Equ%ToD!2 ) exitWith {U;[" ,"] call t$0_uDd pYTtSZ%ct7ed@co*t+= :0 || {isNu] (1'0)} %ě 'LSsD1%GObjHL[*E,(X, /[,L iR](,n Q ;en+U[(4CBAshuffle/)H. <(\ !KInd d' ,4+`/ `Z^nx *B-1P ' (bre"x@`sa} oacC*|),+sX) +$phB k-5,E}uP/7](/);xM .0 dG\teAl\-ef dX @ (P/U\CMT}L\/.Fapyd(,0'TG(b({`!1((}( e)t,*(0 U; Y'0+\1t!1)v>p) ;( Ac$Z\~'h*t '(d')8D*4,XI2Ent*h@!"e@&""+] """@D'e,s9fOIsWI rd@h P\*`flok ((ASLM2AAGLtoL)))5T8x 2T~F*%)`FTsw w)a%)oX(+c!# 0:bwh L0E }*82-71\k/()$!$1H( *7L.3+|4))7*L=qER!&el\'][2604--8+t7#e+[+\Ds@r- !'504@2QsT"*)`I[p.7+lR4/1.S\-Xp1H' &1;TcdoS!$4<'L(<?T+L*ē-8;\3tx"7H5 24)!2x"!I D{(i0d#h! \,'$%,Q, U(T')/)t +(\(8D*, ))T$`&`5( *$  Zqu)9hxJ8%!H">1-)81(Y1 CX MT  l2 h?Raom0 B J5I.< 4| > ]  \ ]t*+\3\ &@t7p5`+$aPU(X(#X'`(X)DaT/Dah'U,4x"5T!ceCT/;.4`'h%n2X'h'|-*T Y""ķ"T#l\*|;^+y)DbX*dK)a @p?!J8!f2!!Ż>D0iU8k!2iP ! !פ!Ƥ! "M_Y$k!!OT!)Ȕu)R*   $;!}X)ZgP!]!<?!i )tq*D"i.Fͤް!ɤA !۰Jd!R!mi5^5iX~\ !a!8!AqDiRe! &Ajx"UZ }i\q7, դIӥܱ E!ѰF\"aaMVxibqh!4 ueF!ã'M~!ŵ!Ű!b#ug!`!"s PLB ,!"!\acѰMAcAczB)i JF" !!qJ!ɝ!~iT !%ѰAlťIU "F:E,I!mQi!+/z/ace/addons/ai/functions/fnc_garrison.sqfK#include "script_component.hpp" /* * Author: alganthe * Internal function used by ace_ai_fnc_garrison to make the units move to the positions it picked. * * Arguments: * 0: Array of arrays * 0: Unit needing to be placed * 1: Position the unit need to be placed at * * Return Value: * Nothing * * Example: * [ [unit1, [10, 10, 10]], [unit2, [30, 30, 30]], [unitN, getPos player] ] call ace_ai_fnc_garrisonMove * * Public: No */ params [ ["_unitMoveList", nil, [[]]] ]; if (isNil "_unitMoveList") exitWith {}; // Start initial movement private _unitMoveListUnits = (_unitMoveList apply {_x select 0}); [QGVAR(setBehaviour), [(_unitMoveListUnits select {leader _x == _x}), "AWARE"], _unitMoveListUnits] call CBA_fnc_targetEvent; [QGVAR(AISection), [_unitMoveListUnits, ["FSM"], false], _unitMoveListUnits] call CBA_fnc_targetEvent; [QGVAR(doMove), [_unitMoveList], _unitMoveListUnits] call CBA_fnc_targetEvent; [QGVAR(enableAttack), [_unitMoveListUnits select {leader _x == _x}, false], _unitMoveListUnits] call CBA_fnc_targetEvent; { _x setVariable [QGVAR(garrisonMove_failSafe), nil, true]; _x setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true]; } foreach _unitMoveListUnits; // Avoid duplicate PFHs if (isNil QGVAR(garrison_moveUnitPFH)) then { missionNameSpace setVariable [QGVAR(garrison_moveUnitPFH), true, true]; // PFH checking if the units have reached their destination [{ params ["_args", "_pfhID"]; private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []]; // End PFH if all units are placed / unable to reach position if (_unitMoveList isEqualTo []) then { missionNameSpace setVariable [QGVAR(garrison_moveUnitPFH), nil, true]; LOG("garrisonMove PFH: PFH finished it's job | deleting PFH"); _pfhID call CBA_fnc_removePerFrameHandler; } else { { _x params ["_unit", "_pos"]; private _fnc_attemptFailed = { if (_failSafeRemainingAttemps == 0 ) then { _unit setVariable [QGVAR(garrisonMove_failSafe), nil, true]; _unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true]; [QGVAR(unGarrison), [[_unit]], _unit] call CBA_fnc_targetEvent; _unitMoveList deleteAt (_unitMoveList find _x); LOG("garrisonMove PFH: all moving commands failed | restoring AI capabilities"); } else { _unit setVariable [QGVAR(garrisonMove_failSafe), [_failSafeTimer + 15, _failSafeRemainingAttemps - 1]]; [QGVAR(doMove), [[[_unit, _pos]]], _unit] call CBA_fnc_targetEvent; LOG("garrisonMove PFH unitReady: unit not close enough | Sending another doMove command"); }; }; private _fnc_attemptSuccessful = { _unit setVariable [QGVAR(garrisonMove_failSafe), nil, true]; _unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true]; _unit setVariable [QGVAR(garrisonned), true, true]; _unitMoveList deleteAt (_unitMoveList find _x); [QGVAR(AISection), [[_unit], ["PATH"], false], _unit] call CBA_fnc_targetEvent; [QGVAR(AISection), [[_unit], ["FSM"], true], _unit] call CBA_fnc_targetEvent; if ({(_x select 0) in units _unit && {!isPlayer (_x select 0)}} count _unitMoveList == 0) then { [QGVAR(enableAttack), [[_unit], true], _unit] call CBA_fnc_targetEvent; }; LOG(format [ARR_2("garrisonMove PFH: unit in position | %1 units left", count _unitMoveList)]); }; // Check if unit is alive or even existing if (!alive _unit || {_unit getVariable [QGVAR(garrisoned), false]}) then { _unitMoveList deleteAt (_unitMoveList find _x); LOG(format [ARR_2("garrisonMove PFH: unit dead, deleted or garrisoned via TP | %1 units left", count _unitMoveList)]); } else { private _unitPos = getPos _unit; if (surfaceisWater _unitPos) then { _unitPos = getPosASL _unit; } else { _unitPos = getPosATL _unit; }; if (unitReady _unit) then { // Check for distance, doMove and AI are moody and may stop for no reason, within 6 meters and ready should be fine if (_unitPos distance _pos < 1.5) then { call _fnc_attemptSuccessful; } else { // Tell the unit to move if an order wasn't given within 30s, avoid doMove spam (_unit getVariable [QGVAR(garrisonMove_failSafe), [CBA_missionTime, 5]]) params ["_failSafeTimer", "_failSafeRemainingAttemps"]; if (_failSafeTimer <= CBA_missionTime) then { call _fnc_attemptFailed; }; }; } else { (_unit getVariable [QGVAR(garrisonMove_unitPosMemory), [CBA_missionTime, [0,0,0]]]) params ["_unitPosTimer", "_unitOldPos"]; // AI may sometimes not be able to report unitReady, this is to avoid the PFH running forever switch true do { case ((_unitPos distance _pos) < 1.5) : { call _fnc_attemptSuccessful; }; case ((_unitPosTimer + 5) < CBA_missionTime && {_unitOldPos distance _unitPos < 0.5}) : { call _fnc_attemptFailed; }; case (_unitOldPos distance _unitPos < 0.5) : {}; default { _unit setVariable [QGVAR(garrisonMove_unitPosMemory), [CBA_missionTime, _unitPos]]; }; }; }; }; } foreach _unitMoveList; missionNameSpace setVariable [QGVAR(garrison_unitMoveList), _unitMoveList, true]; }; }, 0.5, []] call CBA_fnc_addPerFrameHandler; }; 9!&&A+M-M:MtoVisIlB isDay2] l dnZsp eMpamsAsNctQ s(FAsuEGisw sUczthDLp2BdyL8R||1<R _unitMoveListWnilL0DAqE DtƱ1 ace_ai_setBehaviourMVM|E. TAWARE'TAISectionXFSMdox)  enableAttack@@( GJl|DMMJM'0garrisonn _flSafe)!4p*PosMemory] Lku m( M*2]i!}ި]ҥ2 /_veUgFHt8i*_gs@pfhID1+$aB?_p2PunGR pAR?  PaW:T'AaCJ7;|'U]I^ u@UE,@U(Ued .'| vXq-#Eq(%\3SV_yPI&GUcv+}am' f?R@UG'TTimerP(GRemngPempsYVP Wn0ΥLQS'nVgViA'Ew\c}kݙn k,AQ$(I)@Z+0I imV  M7* L7&<"H!!!OldN]Z']TP}]~f+?Y^#'wz\< /%E0D(yV}{y+Q]&EE{Wh FVY'0$UyY\c;qvVM D]&S4 . Z^NjzuJ7IE00 ׸] 1 -} i~i'I''ʰIHIѰI 9v SY`CT(qIfu:U1?I $QF+ F5\!!@hT0Vr2HY!(EM3i]]Z, -'eH[I~Wu43PI!DExl' YeYyq'%AAgI%F !+]}]a% դRm^m3]$%!0#^$idi ۥ6D?M4DFM5M  cFTPY EQU"Iu" %}u8Cf"qGXs!@ ~X M$  8!h A5 >5+{MD+H !3TE/"1륨Yęij2!- !=&Az'M?  2uq}$M !/m H'III7 r !1m9*y$Ri >\I*(Pu,\ THq/JqDF+ UL&!a$uQ8_];$1du &%$!MuM `B{uqei)e~!+y  #line 0 "/z/D /addons/ai/fun#6snc+4.sqf" 1D9sc pt_compHnt.hppp t.>  6lmod;t36*versD <7)6 \ @)3 ) aos ))xx/cba8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d/"70! Y|5| |(debug t()8?l 5 t7 ) 190>30p ams [ ["+e", !}i, [] ]; if (isNil - ) exitWith {}B pvat(+";hs = +V a4ly _x select 0}); ["14oI[, {a rx=V}) "#o"]0] call CBA_q%t!{jetEnt)'op0 Q"!4pa fse $ q/ @* r47 2 {h9tVidD$: sLtru; +|s-}/or 4c 0|S)$ 9r^Zth 5 m"}:NeS c%;+'t([ `p"#tI"$t"2\ Hj/lH29l-@|)' p$,isEqualToH+l .,4", rO@vePFL(eHandler)J} s ,,4N0졹0oc*/0ia#vdtFRZedD20t'H6deno0 3\+` | X: 6l'$(~xN]:`;'} dYtD. fYdT;X61x7 1[,m +!!D 7U- |s?l(+P HWP |4dL1H  Suc+ssful7 2 7p \!w. # 34"lE""/" \?%<$ 7{?(Q() n i s.&& !EPlayTh+}co t.\?x7$' \5 3\ @ /@u$! i"||!$-; R@};D #|1 ;\+#Tq@P`4g!sur4ce$WX!4+ D*ASL: T+AT<@9 uR!y.y?07`'8'adY6aP,H < 1.5?d`]4<5  ;@6deul!B?0 '0 :@. 03 ,3LC- >-$@+</*!tHL4#@,#!R/ >L!Ap!<"վ#Ȏ!ju"f!!"!鉮$!!x!p!uT!!\!$$!݉Ҭ!I=!8%Yhu| !1|$gMR'MM| !MuRͤ!մޤ]]]|!%$d\!y8\]$]Z ] s] n| !\&U+!p!!^4u%y10Y19 Y5//z/ace/addons/ai/functions/fnc_garrisonMove.sqf;#include "script_component.hpp" /* * Author: mharis001 * Initializes the Zeus display. * * Arguments: * None * * Return Value: * None * * Example: * [] call ace_ai_fnc_initDisplayCurator * * Public: No */ addMissionEventHandler ["Draw3D", {call FUNC(drawCuratorGarrisonPathing)}]; J<%ace_ai_fnc_drawcuratorgarrisonpathing_ddmsi eventhandlercall (Draw3Di *BnVM|E #line 0 "/z/ace/addons/ai/functiqf_ itDisplayCurator.sqf" 1\9script_component.hpph t.>  6m nmod;t36*versD <7)6 \ @)3 ) aos ))xx/cba8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d/"70! Y|5| |(debug t()8?l 5 t7 ) 190 3.]M "-EvT Handler ["$(6", {call M __i dD Gar)s Phg}]; "6AqH]&6F5/z/ace/addons/ai/functions/fnc_initDisplayCurator.sqf#include "script_component.hpp" /* * Author: alganthe * Used to un-garrison units. * * Arguments: * 0: Units to un-garrison * * Return Value: * None * * Example: * [unit1, unit2, unit3] call ace_ai_fnc_unGarrison * * Public: Yes * */ params [["_units", [], [[]]]]; _units = _units select {local _x}; { private _unit = _x; if (!isPlayer _unit && {local _unit}) then { _unit enableAI "PATH"; _unit enableAI "FSM"; private _leader = leader _unit; TRACE_3("fnc_ungarrison: unit and leader",_unit , _leader, (_leader == _unit)); _unit setVariable [QGVAR(garrisonned), false, true]; private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []]; _unitMoveList deleteAt (_unitMoveList findIf {_x select 0 == _unit}); if (_leader != _unit) then { doStop _unit; _unit doFollow _leader; } else { _unit doMove ((nearestBuilding (getPos _unit)) buildingExit 0); }; if ((units _unit) findif {(_x getVariable [QGVAR(garrisonned), false]) && !isPlayer _x} == -1) then { LOG("fnc_ungarrison: enableAttack true"); (group _unit) enableAttack true; }; }; } foreach _units; E"!M=R&&U+M-S==_leaderDunit movelists__x buildingexitdeleteaofollowJdo|stopPenabE iDttackIfdifGforchIg p vari|@group^if@ isplayerX'localmissionnamespacenearestUpamsAsJctU s(th*L  R _unitsTgo  wuT |EE '}|ED PATHD FSMace_ai_garrisonned/dMoveList \ H\ v$F    3MYHUaq'uZVti(RzIEU@P"M}+mʥٱ  >Q V.mf2(P TKJ GL?eYDE q0eA$Y2}7X^6԰Ji} }%^y NJ5@i!xFRY FUNi#M XְIPM!F1i$JH? M5q&R@Q =1 E5G U +Y!  []"X i.}  _] |A'7>@Q y(V:ZS') I=DvE!U=Q    #li 0 "/z/Lk/addons/ai/functiqf]lGn.sqf" 1\9sc pt_component.hpph t.>  6m nmod;t36*versD <7)6 \ @)3 ) aos ))xx/cba8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d/"70! Y|5| |(debug t()8?l 5 t7 ) 190<3/pams [["$ZD", ]N[]A;  = select {local _x}M{&p vat%ax| if (!isPlayer&&'|}) then `enableAI ""YE" 2x!ET'x'*leFR= ))( setVari} D0FY#f-setrue`$/* GEm"U3NYeS[cg:+1L *'edA1t?tW,]fdI \{_50!7}))|2$!/`doStop'*d&doFollow-)} hP%-<k ((Uare.Building (A$P) ExU0D'p-1(T| U{ 8x<)U] DS) x0N'-13\,,(grou$)SttkE+}o >achk; "pJ"dC!F>e!H7!D`$MR g^ " F3V-/z/ace/addons/ai/functions/fnc_unGarrison.sqf#include "\z\ace\addons\ai\script_component.hpp" ace_ai ====== Overhaul of AI firing modes of vanilla weapons, encouraging the AI to use full-auto and bursts more often. #define COMPONENT ai #define COMPONENT_BEAUTIFIED AI #include "\z\ace\addons\main\script_mod.hpp" // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS #ifdef DEBUG_ENABLED_AI #define DEBUG_MODE_FULL #endif #ifdef DEBUG_SETTINGS_AI #define DEBUG_SETTINGS DEBUG_SETTINGS_AI #endif #include "\z\ace\addons\main\script_macros.hpp" Invalid position provided. Ungültige Position Position invalide fournie. 位置が無効です。 Posizione invalida fornita. 提供的位置無效 提供的位置无效。 위치가 잘못되었습니다. Podano błędną pozycję. Указана неверная позиция Posição inválida fornecida. Posición inválida proporcionada Pozice není validní. Geçersiz Konum No units provided. Keine Einheit ausgewählt Aucune unité fournie. ユニットがありません。 Nessuna unità fornita. 找不到可用的單位 找不到可用的单位。 병력이 없습니다. Nie podano żadnych jednostek. Не указаны юниты Nenhuma unidade fornecida. No hay unidades proporcionadas. Nejsou k dispozici žádné jednotky. Hiçbir Birim Bulunamadı There aren't enough positions to place all units. Es gibt nicht genug Positionen, um alle Einheiten zu platzieren Il n'y a pas assez de positions pour placer toutes les unités. 全ユニットを置くために十分な位置がありません。 Non ci sono abbastanza posizioni per piazzare tutte le unità. 沒有足夠的位置能擺放所有單位 没有足够的位置能摆放所有单位。 모든 병력을 배치 할 공간이 없습니다. Nie ma wystarczającej ilości pozycji, aby umieścić wszystkie jednostki. Недостаточно позиций для размещения всех юнитов Não há posições suficientes para colocar todas as unidades. No hay suficientes posiciones para colocar todas las unidades. Není dostatek pozic pro všechny jednotky. Tüm birimleri yerleştirmek için yeterli konum yok. No building found. Kein Gebäude gefunden Aucun bâtiment trouvé. 建物がありません。 Nessun edificio trovato. 沒找到建築物 没找到建筑物。 건물이 없습니다. Nie znaleziono budynku. Здание не найдено Nenhuma construção encontrada. No se ha encontrado ningún edificio. Nenalezena žádná budova. Bir yapı bulunamadı 0DHT#include "script_component.hpp" [QGVAR(AISection), { params [["_units", [], [[]]], ["_sections", [], [[]]], ["_bool", true, [true]]]; { private _section = _x; { if (_bool) then { _x enableAI _section; LOG_3("%1 enableAI %2 | ID: %3",_x,_section,clientOwner); } else { _x disableAI _section; LOG_3("%1 disableAI %2 | ID: %3",_x,_section,clientOwner); }; } forEach (_units select {local _x}); } forEach _sections; }] call CBA_fnc_addEventHandler; [QGVAR(unGarrison), FUNC(unGarrison)] call CBA_fnc_addEventHandler; [QGVAR(doMove), { params ["_unitsArray"]; { _x params ["_unit", "_pos"]; _unit setDestination [_pos, "LEADER PLANNED", true]; _unit doMove _pos; LOG_3("%1 doMove %2 | ID: %3",_unit,_pos,clientOwner); } forEach _unitsArray; }] call CBA_fnc_addEventHandler; [QGVAR(setBehaviour), { params ["_groupsArray", "_behaviour"]; { _x setBehaviour _behaviour; LOG_3("%1 setBehaviour %2 | ID: %3",_x,_behaviour,clientOwner); } forEach _groupsArray; }] call CBA_fnc_addEventHandler; [QGVAR(enableAttack), { params ["_unitsArray", "_mode"]; { _x enableAttack _mode; LOG_3("%1 enableAttack %2 | ID: %3",_x,_mode,clientOwner); } forEach _unitsArray; }] call CBA_fnc_addEventHandler; [QGVAR(setUnitPos), { params ["_unit", "_mode"]; _unit setUnitPos _mode; }] call CBA_fnc_addEventHandler; [QGVAR(setSpeedMode), { params ["_unit", "_mode"]; _unit setSpeedMode _mode; }] call CBA_fnc_addEventHandler; [QGVAR(setCombatMode), { params ["_unit", "_mode"]; _unit setCombatMode _mode; }] call CBA_fnc_addEventHandler; [QGVAR(allowFleeing), { params ["_unit", "_cowardice"]; _unit allowFleeing _cowardice; }] call CBA_fnc_addEventHandler; [QGVAR(enableGunLights), { params ["_unit", "_mode"]; _unit enableGunLights _mode; }] call CBA_fnc_addEventHandler; %!+ _behavioursoolpcowardice Rgrpsraylmode\posXsection ()stunits Vxa_ai_fncQgJisCallfleeingA c]Zbaadventhandler]d ab ai^ do 've^en\ ttkg lightsforeach^ifNloHM p $amsBse ctG set' c bi"des @nX sp 1d|X*Xt @'Zth"_,&ace_ai_AISection _unitsWp Us4@boolYr E *U  6 -fEF'w} mMzLXM ~$  EXk}A |EA .@EUD I½  ɱwYXP E|f|%iR\4unGarrisonTdoMove+ 5A ay/xX _posLEADER PLANNEDQP X ITA U "Y&Bia5ݥ E ܽͥY @\!Y  L#A\L)J|e" /b "'D"TB setBehaviourK\_group dPM3'1 e "qH@E|'a@i  u$J7ݤ+` enableAttack1lmodeYAp.'IbV*ir e\Ep'I $3i( u,m%+M%U]P 't')U<'y y0>i1q8 eE1`p E-DSpeedMa NA>*ASe5 ri6a A x P(@Combat E?*Ei: i;\JDE * allowFleeing-(uEcardiceBYH' G} ? ki@q ~M^qp1,!GLightsMA+qDiEm TD` *#l,e 0 "/z/_ /adnsi/XEHf|tIT.sqf" 1L/scriptAm n(t.hppp  )+m n@K.x 6*versP<7)6 \ @)3 ) aos )){x/c8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d"" 0! Y|5| (debug x()8?l 5 t7 )5)30 [".,H", {params [["$;B[]N[]Y"' H/`"HPtrue\xE; rivate  = x,`if ( )h:-tc_x % >I'H(4,E} l 43dis 4(8} forEachT' lT {local^ })('8; }] Tl CBA_fnc_F8Ev@<Handler;)(H@.h(\ ,$`I/?#C"/H%,]"tL`O tDeii=[tP,JF/ l(h/ ( *TI1)xI'xI38*1 (9)| *I<t"G3*  4%,J5/' 'hJ ' (K ( *K:'K,* ( X 'L - !qeAqp!\#!`aCq"RFq !/z/ace/addons/ai/XEH_postInit.sqf%#include "script_component.hpp" ADDON = false; PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; ADDON = true; ,$ace_aicallXba_fnc_compilefunction0=\z\ace\addons\ai\functiqf_drawCuratorGarrisonPathing.sqf%U_ _<+?g +\/ Move 3$z5?4initDisplay +L0-?fun$ +D(p?#line 0 "/z/Y/ / /XEH_preIH~" 1H/sc pt_component.hppl  )+m nmod.x 6*versD)<7)6 \ @)3 ) aos ))xx/cba8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d"" 0! Y|5| (debug x()8?l 5 t7 )5)20 $1 = false; ;:1|PREP?0,[" 9", 9"] call CBA`#ileF ;  * :- )&:5x !4;-0 !,;-(p?6628 T'C tru_Y $q fe@H4 /]!D Maqq  arq  aqzq  aqq 17E L /z/ace/addons/ai/XEH_preInit.sqf//z/ace/addons/ai/XEH_PREP.hpp PREP(drawCuratorGarrisonPathing); PREP(garrison); PREP(garrisonMove); PREP(initDisplayCurator); PREP(unGarrison); #include "script_component.hpp" #include "XEH_PREP.hpp" #callXba_fnc_compilefunction. =\z\ace\addons\ai\functiqf_drawCuratorGarrisonPathing.sqf%U_ _<+?g +\/ Move 3$z5?4initDisplay +L0-?fun$ +D(p #line 0 "/z/Q/ / /XEH_preStartz" 1L/sc pt_component.hppp  )+m nmod.x 6*vers@)<7)6 \ @)3 ) aos ))xx/cba8qm0 ''  }42 X  Z  (5 k4 A,3( T 2 /xehH;29d"" 0! Y|5| (debug x()8?l 5 t7 )5)30:0tPREP?0,[" Z9", X9"] call CBAx ileF ;  *9- )&P:5x !4:-0 !,H;-(p?63 qH # q